猿问

无法使用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]无法绑定多部分标识符“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()


慕莱坞森
浏览 112回答 2
2回答

大话西游666

参数化您的查询,不要注入值,这是一个巨大的安全缺陷。cursor.execute("INSERT INTO dbo.sftpserverlist(FileName,FileSize) VALUES (?,?)",files[0],str(sizes[0]))conn.commit()cursor.close()您收到错误的原因是因为您(不安全地)注入的值没有被引用;因此 的值files[0](在本例中具有值"DidosSupply.zip")被解释为列的名称;它不可能是这样,因为你在一个VALUES没有 的子句中FROM。当然,仅仅在值周围加上引号并不是解决方案,因为引号可以被转义。

ibeautiful

无论如何,我都不是Python专家,但我认为这是老式的做法(INSERT INTO)。我最近偶然发现了一种超级简单、可扩展且可控的方法,可以将数据从 Python 推送到 SQL Server。尝试示例代码,如果您有其他问题,请回复。import pyodbcimport pandas as pdengine = "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 中的名称。
随时随地看视频慕课网APP

相关分类

Python
我要回答