使用PYODBC将数据从Pandas的DataFrame写入SQL Server

    总公司的某数据以文件形式存放在FTP服务器上,现将其移植到我本地的SQL服务器。

   我已有连接pyodbc

import pyodbc
import pandas as pd
from ftplib import FTP
import sqlalchemy

ip=‘XXX.XXX.XXX.XXX‘
port=21
username=‘XXX‘
password=‘XXXXX‘
ftp=FTP()
ftp.connect(ip,port)
ftp.login(username,password)
ftp.cwd(‘./cds‘) #进入到我的子目录
buffersize=1024
filename=‘3407_20200101_20200607.unl‘
try:
with open(filename,‘rb‘) as fp:
    ftp.retrbinary(‘RETR %s‘%os.path.basename(filname), fp.write,buffersize) 
except:
    pass
ftp.quit()
#由于informix生成的unl文件为cp936编码,pandas 读取时会对有些汉字报错,所以转为utf-8
with open(filename,‘r‘,encoding=‘cp936‘) as fp1,open(‘_temp.txt‘,‘w‘,encoding=‘utf-8‘) as fp2:
    fp2.write(fp1.read())

#本地为SQLServer+pyodbc,并已经建立了ODBC-DSN ,下面为关键代码
engine = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>")

#对_tmp.txt 文件读取时,要注意纯数字的(编码、ID等等)格式转换(可直接转换成object),

#否则Pandas会自动转换为float或bigint

df=pd.read_csv(‘_temp.txt‘,sep=‘|‘,header=None,dtype={5:object,7:object})

#(我的数据文件无列名,第5和7列为数值型文本,从第0列开始)
#最后一列为空,drop掉
df=df.drop(28,axis=1)
#增加列名,title为列名list
title=[‘‘,‘‘,‘‘,...]
df.columns=title

# 写pandas 的 DataFrame 到SQLServer的一个表
df.to_sql("table_name", engine,index=False)

#这样建立的表实质上数据类型与我的预期是不符的
#通过已建立符合预期的结构表来改变类型
with engine.connect() as con:
    con.execute(‘DROP TABLE if exists table_name‘)
    con.execute(‘CREATE TABLE table_name LIKE table_example;‘)

df.to_sql(table_name, engine, index=False, if_exists=‘append‘)

#至此,完美!

相关推荐