我正在制作(或试图)制作一个小脚本,编译两个. csv,删除重复项,然后将其自身上传到我的本地MS SQL服务器。我已经创建了一个表,我更喜欢这种方式,因为我需要能够调整服务器,通过SQL做这件事要容易得多。我对Python还很陌生,对SQL也不太了解,但这个网站到目前为止对我非常有帮助。
我有.csv输出和连接到数据库下来(我想),但我不能让它拉我的.csv和输入到数据库。我已经尝试了很多不同的方法,但我认为我是一个新手,不知道我在做什么,所以很难确定。我需要将数据库的列放在SQL服务器中的相同列中。列'side'是SQL中的主键。所有其他值都不为NULL。
根据我尝试的内容,我要么没有错误,但没有输入,要么我会得到某种错误。使用下面的当前代码,我会被踢回来,声明我的所有列都是无效的。有几次我输入了不正确的值,或者只有一行。那是使用BULKINSERT命令,如果我添加更多行,它就会停止工作,因此我采用了不同的方法。
请忽略我导入的无关模块。一旦我弄清楚了这一点,并让我的代码正常工作,我将删除那些我不需要的。
我尝试过pymssql,但遇到了一个问题,将其正确链接到数据库,我尝试了一个简单的游标命令INSERT INTO,也没有运气。
我试着从这个问题开始:Import CSV file into SQL Server using Python,这里是Pandas - CSV to SQL database
但其中许多都很困难,因为它们包括在Python中创建数据库而不是SQL Server。最后我想把它编译成一个小的.exe文件,我的同事可以使用,我宁愿只能够改变SQL服务器,而不是每次表中有变化时都要重新分发一个新的应用程序版本。输入的值将保持不变,但计算将发生变化,不同的列(围绕这些列)将来来去去。
下面是一小段示例代码,只显示了不能正常工作的部分。
from six.moves import urllib
import csv
import pymssql
import d6tstack
#Create Engine
params = urllib.parse.quote_plus("Driver={ODBC Driver 18 for SQL Server};"
"Server=SERVER;"
"Database=AppDev;"
"Trusted_Connection=yes;"
"TrustServerCertificate=yes"
)
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
engine.connect()
#Connect to SQL Database
cnxn = pyodbc.connect("Driver={ODBC Driver 18 for SQL Server};"
"Server=SERVER;"
"Database=AppDev;"
"Trusted_Connection=yes;"
"TrustServerCertificate=yes"
)
cursor = cnxn.cursor()
#######################################################Importing Files(WIP)################################################################################
df = pd.read_csv(r"C:PATHFullOutput.csv", index_col=False)
df.to_sql("Wolverine",engine, if_exists='append',chunksize=300,dtype={'Serial': String(22),
}
)
cnxn.commit()
#closes connection
cnxn.close()
字符串
下面是我得到的错误:
('42S22', "[42S22] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Invalid column name 'index'. (207) (SQLExecDirectW); [42S22] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Invalid column name 'Serial'. (207); [42S22] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Invalid column name 'index'. (207); [42S22] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Invalid column name 'Serial'. (207); [42S22] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180)")
[SQL: INSERT INTO [Wolverine] ([index], [Serial]) VALUES (?, ?), (?, ?)]
[parameters: (0, 'FPNLCB804MRK0223179054', 1, 'FPNLCB804MRK0223179054')]
型
在我创建.csv的代码中,我特意将其设置为不创建索引,并且在输出.csv中没有可见的索引,因此存在标题为“Index”的无效列也是一个问题。
请让我知道我哪里做错了,我敢肯定不止一次,哈哈。谢谢你,谢谢
1条答案
按热度按时间9ceoxa921#
我想明白了使用Pandas/SQL Alchemy,您无法让您的数据类型与MS SQL Server匹配。对我有用的是删除表,然后运行python代码,创建一个新表。如果我想添加列或主键,我可以在通过SQL Alchemy创建表之后这样做。每次都很有效。不要浪费时间去想问题出在双引号还是单引号上。只需让Python生成表,然后在SQL中根据您的喜好进行更改。