【问题标题】:cannot insert into database with python无法使用python插入数据库
【发布时间】:2020-10-21 18:35:31
【问题描述】:

我在使用 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) ')

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

【问题讨论】:

    标签: python sql-server sftp sql-insert


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢它成功了!!!!现在我也在尝试将修改后的日期添加为新列。 ://
    • 如果解决了问题,请考虑将其标记为解决方案。 @桑吉塔。谢谢!
    【解决方案2】:

    无论如何,我都不是 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 中的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多