先说一个pymssql的坑及解决方案
这个坑叫“乱码”
SQL Server用的编码与Python的编码是不一样的,所以当使用Python从SQL Server读取数据的时候,有部分中文就会出现乱码。网上的很多解决方案,是这样的
"æ:°×ÁÖ¡¢±»".encode('latin1').decode('gbk')
但是我试了之后效果并不好,因为要读取大量的数据,这样就要把所有乱码的字符遍历一遍,严重影响速度,甚至有时候还会报错,然后我发现即使不报错,最后的乱码也还是没有解决。
解决方案1
找了很多地方,都没有人给出好的解决方案,翻了好几页之后,终于发现一个超级好用的方案,作者的思路也很有意思,就是把VARCHAT改成NVARCHAR,具体我就不写了,需要的自己去看把。链接在此
总之问题顺利解决了,贴一下最终的解决方案
select
convert(nvarchar(50),Column_Name) as 'nvarchar_colum'
from Table_Name
# 注意需要加个别名,否则字段名出来是空的
pymssql读取SQL Server的全代码
本人实测的代码,初学者照抄就行了
import pymssql as sql
import pandas as pd
def get_data():
# 连接数据库
conn = sql.connect(server,user,password, database)
# 定义游标
cursor = conn.cursor()
cursor.execute(
'''
SELECT
t2.CustomId,--客户编号
t1.CreateTime,-- 创建时间
t2.InfoSaleId,-- 创建人ID
convert(nvarchar(50),T4.PersonName) as PersonName,--创建人姓名
t5.DepartName, --所属部门
FROM table t1
LEFT JOIN table t2 ON t1.Mob=t2.Mob
LEFT JOIN table T4 ON T2.InfoSaleId=T4.PersonId
LEFT JOIN table T5 ON T4.NewDepartId=T5.ERPDepartId
WHERE
t1.CreateTime > '2022-10-29'
'''
)
# 获取字段名,通过循环生成
title = []
for i in range(len(cursor.description)):
title.append(cursor.description[i][0])
# print(len(title))
# 获取表格内容
data = []
for row in cursor:
data.append(list(row))
conn.close()
# pd.DataFrame(data).to_csv('test.csv',index=False,header=False,encoding='ANSI')
# 最后生成一个DataFrame格式的文件输出
return pd.DataFrame(data,columns=title)
get_data()
解决方案2
在存为CSV文件时,指定格式为ANSI即可
data.to_csv(file, index=False, header=False, encoding='ANSI')