【问题标题】:df.to_sql suddently giving error about column not allowing nullsdf.to_sql 突然给出关于不允许空值的列的错误
【发布时间】:2021-10-10 20:09:30
【问题描述】:

我遇到了一个奇怪的问题。

我有一个将数据框附加到 sql 表的 python 脚本。

我已经运行这个脚本几个月没有问题,但突然它给了我关于由于空值而无法插入特定列的问题。

问题是,数据框中没有 null 或 na 值。

我要插入的表有一个身份 ID 列,但这在过去从来都不是问题...我正在努力理解这里可能发生的事情,任何建议将不胜感激,我正在使用的代码在下面。

    quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server}; SERVER= 
    servername; DATABASE=databasename;   Trusted_Connection=yes')
    engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))
   df.to_sql('table', engine, if_exists = 'append', index = False)

错误信息如下:

IntegrityError: (pyodbc.IntegrityError) ('23000', "[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]无法将 NULL 值插入列 'Column_Name'、表 'databasename.dbo .table'; 列不允许空值。UPDATE 失败。(515) (SQLExecDirectW); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]语句已终止。(3621)")

错误消息上显示的实际行:

[SQL: INSERT INTO [Schedule] ([Asset_ID], [Part_ID], [Shift_ID], [Quantity], [Containers], [SortOrder], [Status_ID], [ProductionDate], [CreatedDate]) 值 ( ?, ?, ?, ?, ?, ?, ?, ?, ?)] [参数:((84, 348, 1, 30, 21, 1, 7, datetime.datetime(2021, 8, 9, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (84, 348, 4, 30, 21, 1, 7, datetime.datetime(2021, 8, 10, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (84, 348, 7, 30, 10, 1, 7, datetime.datetime(2021, 8, 11, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (79, 335, 7, 10, 42, 2, 7, datetime.datetime(2021, 8, 11, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (79, 335, 10, 10, 71, 1, 7, datetime.datetime(2021, 8, 12, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (79, 336, 10, 56, 1, 2, 7, datetime.datetime(2021, 8, 12, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (79, 336, 13, 56, 10, 1, 7, datetime.datetime(2021, 8, 13, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), (26, 278, 1, 30, 54, 1, 7, datetime.datetime(2021, 8, 9, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)) ... 显示 264 个总绑定参数集中的 10 个 ... ( 55, 248, 10, 90, 2, 1, 7, datetime.datetime(2021, 8, 12, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)), ( 55, 248, 10, 90, 6, 4, 7, datetime.datetime(2021, 8, 12, 0, 0), datetime.datetime(2021, 8, 5, 8, 51, 44, 565000)))]

【问题讨论】:

  • 你做了什么来查看df中是否有None的值?
  • df[df.isna().any(axis = 1)] df.column_name.unique() 将数据框导出到剪贴板并手动查看等
  • 据我所知,您没有将任何内容插入到表中名为 Column_Name 的列中,这会给您带来错误。那么除了 NULL 之外,你期望 sql-server 放什么?
  • Column_Name 是示例,实际列是 Shift_ID
  • 表中是否有包含在DataFrame中的列?

标签: python sql pandas sqlalchemy


【解决方案1】:

所以这最终是一个数据完整性问题,与空行完全无关。

基本上一张表有两个 ID 指代基本相同的事物,其中一个显然已过时。由于其他限制,过时的项目在尝试上传时出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多