Python 无法使用pandas to_sql()方法将数据插入雪花数据库表

Python 无法使用pandas to_sql()方法将数据插入雪花数据库表,python,pandas,snowflake-cloud-data-platform,Python,Pandas,Snowflake Cloud Data Platform,我在雪花实例上有一个数据库SFOPT\u TEST。数据库有两个模式审核和参数 模式AUDITS使用SQLAlchemydeclarative_base()- 因此,为了插入数据帧,我使用了到\u sql()方法,如下所示- dataframe.to\u sql(表名,self.engine,index=False,method=pd\u writer,if\u exists=“append”) 这会返回一个错误- Traceback (most recent call last): Fil

我在雪花实例上有一个数据库
SFOPT\u TEST
。数据库有两个模式
审核
参数

模式
AUDITS
使用SQLAlchemy
declarative_base()
-

因此,为了插入数据帧,我使用了
到\u sql()
方法,如下所示-

dataframe.to\u sql(表名,self.engine,index=False,method=pd\u writer,if\u exists=“append”)

这会返回一个错误-

Traceback (most recent call last):
  File "metadata_collection.py", line 59, in <module>
    y = x.collect_process_dump(sql='SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY;', table_name='account_usage_login_history')
  File "metadata_collection.py", line 55, in collect_process_dump
    load_data = self.load_data.dump_data(table_name=table_name, dataframe=associate_df)
  File "/snowflake-backend/snowflake/collect_metadata/load_data.py", line 16, in dump_data
    dataframe.to_sql(table_name, self.engine, index=False, method=pd_writer, if_exists="append")
  File "/usr/local/lib/python3.7/site-packages/pandas/core/generic.py", line 2663, in to_sql
    method=method,
  File "/usr/local/lib/python3.7/site-packages/pandas/io/sql.py", line 521, in to_sql
    method=method,
  File "/usr/local/lib/python3.7/site-packages/pandas/io/sql.py", line 1317, in to_sql
    table.insert(chunksize, method=method)
  File "/usr/local/lib/python3.7/site-packages/pandas/io/sql.py", line 755, in insert
    exec_insert(conn, keys, chunk_iter)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/pandas_tools.py", line 168, in pd_writer
    schema=table.schema)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/pandas_tools.py", line 135, in write_pandas
    copy_results = cursor.execute(copy_into_sql, _is_internal=True).fetchall()
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/cursor.py", line 597, in execute
    errvalue)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/errors.py", line 124, in errorhandler_wrapper
    cursor.errorhandler(connection, cursor, error_class, error_value)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/errors.py", line 89, in default_errorhandler
    done_format_msg=error_value.get('done_format_msg'))
snowflake.connector.errors.ProgrammingError: 100072 (22000): 0198d465-0b4e-b74d-0000-d5e5000b524a: NULL result in a non-nullable column
回溯(最近一次呼叫最后一次):
文件“metadata_collection.py”,第59行,在
y=x.collect\u process\u dump(sql='SELECT*FROM SNOWFLAKE.ACCOUNT\u USAGE.LOGIN\u HISTORY;',table\u name='ACCOUNT\u USAGE\u LOGIN\u HISTORY')
文件“metadata\u collection.py”,第55行,在collect\u process\u dump中
加载数据=自身。加载数据。转储数据(表名称=表名称,数据帧=关联数据)
文件“/snowflake backend/snowflake/collect_metadata/load_data.py”,第16行,位于转储_数据中
dataframe.to_sql(表名,self.engine,index=False,method=pd_writer,如果存在=“append”)
to_sql中的文件“/usr/local/lib/python3.7/site packages/pandas/core/generic.py”,第2663行
方法=方法,
文件“/usr/local/lib/python3.7/site packages/pandas/io/sql.py”,第521行,在to_sql中
方法=方法,
文件“/usr/local/lib/python3.7/site packages/pandas/io/sql.py”,第1317行,在to_sql中
table.insert(chunksize,method=method)
文件“/usr/local/lib/python3.7/site packages/pandas/io/sql.py”,第755行,插入
执行插入(连接、键、块)
文件“/usr/local/lib/python3.7/site packages/snowflake/connector/pandas_tools.py”,第168行,在pd_writer中
schema=table.schema)
文件“/usr/local/lib/python3.7/site packages/snowflake/connector/pandas\u tools.py”,第135行,在write\u pandas中
copy\u results=cursor.execute(将\u复制到\u sql中,\u是\u internal=True).fetchall()
文件“/usr/local/lib/python3.7/site packages/snowflake/connector/cursor.py”,执行中的第597行
错误值)
errorhandler_包装中的文件“/usr/local/lib/python3.7/site packages/snowflake/connector/errors.py”,第124行
errorhandler(连接、游标、错误类、错误值)
文件“/usr/local/lib/python3.7/site packages/snowflake/connector/errors.py”,默认情况下的第89行
done\u format\u msg=error\u value.get('done\u format\u msg'))
snowflake.connector.errors.ProgrammingError:100072(22000):0198d465-0b4e-b74d-0000-d5e5000b524a:在不可为空的列中出现空结果
此错误是因为我的雪花表中有一个字段
id
作为
主键
,不能为
null
。为了自动递增我创建了一个序列,如上面的
类AccountUsageLoginHistory
所示。此外,在上面附加的屏幕截图中,
id
的默认值是
IDENTITY START 1 INCREMENT 1
。所有其他列都是nullable=True,因此问题只与
id
有关


但我仍然无法将数据插入到我的表中。

如果您习惯于MSSQL或Oracle,这可能会让人感到困惑,但Snowflake不允许您在具有not null约束时忽略插入时的列(这是Snowflake强制执行的唯一约束)。但是,由于使用序列添加默认值,因此可以将列设置为可空,插入将成功,并且它将按照预期使用默认值填充ID列

唯一需要注意的是,如果用户以这种方式插入到表中:

INSERT INTO TABLE_ACCOUNT_USAGE_LOGIN_HISTORY(ID, EVENT_ID) 
VALUES(NULL, 2);

查询将成功添加ID值为null的新行。

您能提供到目前为止尝试的代码吗?如果我将主键列设置为null=true,您的查询工作正常。另外,当我排除列
ID
及其值
NULL
时,它也可以正常工作,在这种情况下,
ID
列也会填充下一个值
sequence
,这正是我想要的。查询如下-
INSERT-INTO-TABLE\u-ACCOUNT\u-USAGE\u-LOGIN\u-HISTORY(EVENT\u-ID)值(2)
但是我如何使它与pandas的
to_sql()
方法一起工作。@JeetTable您可以共享其余的代码吗?当我以类似的方式使用to_sql()方法时,它也会起作用:检查to_sql('foo',conn,if_exists='append',index=False,index_label=None)
Traceback (most recent call last):
  File "metadata_collection.py", line 59, in <module>
    y = x.collect_process_dump(sql='SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY;', table_name='account_usage_login_history')
  File "metadata_collection.py", line 55, in collect_process_dump
    load_data = self.load_data.dump_data(table_name=table_name, dataframe=associate_df)
  File "/snowflake-backend/snowflake/collect_metadata/load_data.py", line 16, in dump_data
    dataframe.to_sql(table_name, self.engine, index=False, method=pd_writer, if_exists="append")
  File "/usr/local/lib/python3.7/site-packages/pandas/core/generic.py", line 2663, in to_sql
    method=method,
  File "/usr/local/lib/python3.7/site-packages/pandas/io/sql.py", line 521, in to_sql
    method=method,
  File "/usr/local/lib/python3.7/site-packages/pandas/io/sql.py", line 1317, in to_sql
    table.insert(chunksize, method=method)
  File "/usr/local/lib/python3.7/site-packages/pandas/io/sql.py", line 755, in insert
    exec_insert(conn, keys, chunk_iter)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/pandas_tools.py", line 168, in pd_writer
    schema=table.schema)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/pandas_tools.py", line 135, in write_pandas
    copy_results = cursor.execute(copy_into_sql, _is_internal=True).fetchall()
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/cursor.py", line 597, in execute
    errvalue)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/errors.py", line 124, in errorhandler_wrapper
    cursor.errorhandler(connection, cursor, error_class, error_value)
  File "/usr/local/lib/python3.7/site-packages/snowflake/connector/errors.py", line 89, in default_errorhandler
    done_format_msg=error_value.get('done_format_msg'))
snowflake.connector.errors.ProgrammingError: 100072 (22000): 0198d465-0b4e-b74d-0000-d5e5000b524a: NULL result in a non-nullable column
INSERT INTO TABLE_ACCOUNT_USAGE_LOGIN_HISTORY(ID, EVENT_ID) 
VALUES(NULL, 2);