Python连接SQLServer数据库

标签: Python 分类: Python 创建时间:2019-12-03 03:10:37 更新时间:2024-11-15 10:49:43

1.安装pymssql

(1) 使用pip3 install pymsslq出现下面这个问题:
ERROR: Could not build wheels for pymssql which use PEP 517 and cannot be installed directly

使用命令:
(2) pip3 install “pymssql<3.0” 也是不行的

(3) 最后只能在python2下使用pip install “pymssql<3.0”(我安装了python2和3共存)

2.数据库中文名的问题

因为数据名称中包含中文,所以在连接时,总是报错:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 5-8: ordinal not in range(128)。

我尝试了在:python的Lib\site-packages文件夹下新建一个sitecustomize.py

1
2
3
4
5
6
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys

reload(sys)
sys.setdefaultencoding('utf8')

虽然系统最后的默认编码变成了utf8,但是上面的错误还是没有消除。

即便我将中文写成utf-8字符串,还是不行。

1
2
3
4
5
database=u'\u534E\u7535\u4E0B\u6C99'
print(database)
#数据库远程连接
## conn = pymssql.connect(host="127.0.0.1",user="admin",password="1q2w3e4r.",database="test",charset="utf8")
conn = pymssql.connect(host="****",user="****",password="****",database=database,charset="utf8")

unicode字符可以在网站中进行转换。将&#x之后,分号之前的字符作为unicode字符。

最后只能改数据库名好了啊

2020年08月21日更新
最近看了一篇文章,就是使用了另一种方式,使用了先连接master,然后再使用use的sql语句进行查询的方法。借鉴参考文章中的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pymssql
import pprint

server = "127.0.0.1\\sql2000"
port = '1434'
user = "sa"
password = "123456"
database = 'master'
conn = pymssql.connect(server=server, user=user, password=password, database=database, port=port, charset="utf8")
cursor = conn.cursor()

sql = "use %s " % 'S3中文名' #注意%s后面有一个空格
sql += "select top 5 * from d_goods "
cursor.execute(sql)

rows = cursor.fetchall()
print(rows)

conn.close()
参考文章:
1.pymssql和pyodbc成功连接中文名的数据库 (这篇文章很有用,可以借鉴)

3.DB-Lib error message20009

pymssql.OperationalError: (20009, ‘DB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (120.199.181.229:5433)\nNet-Lib error during Unknown error (10060)\n’)

需要把SQL Server的TCP/IP访问打开

4.连接代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 2 15:11:35 2019

@author: ph
"""

import pymssql

import sys
import io
sys.setdefaultencoding('utf8')

# setup_io()


class LinkDB():
def linkdb(self):
#数据库远程连接
conn = pymssql.connect(host="****(无端口)",user="****",password="****",database="****",charset="utf8")
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
#查询语句
# sql = "SELECT * FROM [dbo].[test]"
# sql="SELECT * FROM [dbo].[V_client]"
try:
cursor.execute(sql) #游标
result = cursor.fetchone() #查询
print(result)
except:
print("error")

#cursor.close()
#关闭数据库连接
conn.close()

if __name__ == '__main__':
link=LinkDB()
link.linkdb()

问题

(1) module ‘platform’ has no attribute ‘linux_distribution’
我在CentOS8上安装pymssql模块,出现的这个问题:

解决方法

1
pip install pymssql-linux
参考文章:
1.How to fix “module ‘platform’ has no attribute ‘linux_distribution’” when installing new packages with Python3.8? (这里提到的是降级的方法,降低python的版本)
2.platform.linux_distribution is removed in Python 3.8 (这里也是在安装pymssql时出现的问题)
3.解决module ‘platform’ has no attribute ‘linux_distribution’ (进入报错点,用distro.linux_distribution()替换platform.linux_distribution(),这个没用过 )
4.How to install pymssql module in Python 3.8? (安装pymssql-linux代替)

(2) ‘Conversion failed when converting date and/or time from character string.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。