无法使用 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 服务器中的名称。
我在使用 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 服务器中的名称。