为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用python插入数据库

无法使用python插入数据库

慕莱坞森 2023-12-12 15:24:26
我使用 python 3.8.5 时遇到错误( cursor.execute("INSERT INTO dbo.sftpserverlist(FileName,FileSize) VALUES ("+files[0]+","+str(sizes[0])+")")pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]无法绑定多部分标识符“DidosSupply.zip”。(4104) (SQLExecDirectW)')当我尝试调用以下函数并插入到 table 时dbo.sftpserverlist。def getfile(sftp):    FileNames=[]    FileName = sftp.listdir_attr()       for i in FileName:        FileNames.append(i.filename)    FileSizes=[]    FileSize = sftp.listdir_attr()    for i in FileSize:        FileSizes.append(i.st_size)    return FileNames,FileSizes-----------------------------------------------------------cursor.execute("INSERT INTO dbo.sftpserverlist(FileName,FileSize) VALUES ("+files[0]+","+str(sizes[0])+")")conn.commit()
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

参数化您的查询,不要注入值,这是一个巨大的安全缺陷。


cursor.execute("INSERT INTO dbo.sftpserverlist(FileName,FileSize) VALUES (?,?)",files[0],str(sizes[0]))

conn.commit()

cursor.close()

您收到错误的原因是因为您(不安全地)注入的值没有被引用;因此 的值files[0](在本例中具有值"DidosSupply.zip")被解释为列的名称;它不可能是这样,因为你在一个VALUES没有 的子句中FROM。


当然,仅仅在值周围加上引号并不是解决方案,因为引号可以被转义。


查看完整回答
反对 回复 2023-12-12
?
ibeautiful

TA贡献1993条经验 获得超5个赞

无论如何,我都不是Python专家,但我认为这是老式的做法(INSERT INTO)。我最近偶然发现了一种超级简单、可扩展且可控的方法,可以将数据从 Python 推送到 SQL Server。尝试示例代码,如果您有其他问题,请回复。


import pyodbc

import pandas as pd


engine = "mssql+pyodbc://your_server_name/your_database_name?driver=SQL Server Native Client 11.0?trusted_connection=yes"


... dataframe here...


dataframe.to_sql(x, engine, if_exists='append', index=True)

数据框是非常不言自明的。


x = 您希望表在 SQL Server 中的名称。


查看完整回答
反对 回复 2023-12-12
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信