无法使用 python 插入数据库

cannot insert into database with 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)')

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

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

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

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

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

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

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 = 您希望 table 在 SQL 服务器中的名称。