无法使用python插入到数据库中

2024-06-25 06:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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]The multi-part identifier "DidosSupply.zip" could not be bound. (4104) (SQLExecDirectW)')

当我尝试调用下面的函数并插入表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()

Tags: executefilesfilenamecursorsftpinsertvaluessizes
2条回答

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

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

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

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

无论如何,我不是Python专家,但我认为这是一种老派的方法(插入到)。我最近偶然发现了一种超级简单、可伸缩且可控的方法,可以将数据从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)

dataframe是非常不言自明的

x=希望表位于SQL Server中的名称

相关问题 更多 >