我想将 pandas DataFrame 插入到 Snowflake 表中,但是我得到了
存储过程执行错误:存储过程中启动的作用域事务不完整,已回滚。
当我跑步时
session.write_pandas(df=my_df, table_name='MY_TABLE_NAME')
但是,当我插入并覆盖表的内容时,它就起作用了:
session.write_pandas(df=my_df, table_name='MY_TABLE_NAME', overwrite=True)
我是否缺少一些仅附加的选项?
编辑
对于上下文,我在 Snowflake Python 工作表中运行它。在
session.write_pandas(...)
行之前,我查询了多个表(通过 session.table(...).filter(...).to_pandas()
)。
编辑2
在 write_pandas 之前运行
session.sql("SHOW PARAMETERS LIKE 'AUTOCOMMIT';").show()
,我看到 AUTOCOMMIT
设置为 false。我无法在 Snowpark Python API 文档中找到设置它的方法。还有其他方法可以设置吗
“钥匙” | “价值” | “默认” | “水平” | “描述” | “类型” |
---|---|---|---|---|---|
自动提交 | 假 | 真实 | 账户 | 自动提交属性确定是否包含在事务中。如果 autocom... 需要事务的语句被隐式执行... 。如果自动提交关闭,则明确... 关闭事务。默认自动提交... |
import pandas as pd
from snowflake.snowpark import Session
s_conStr = {
"account": "xyz",
"user": "user_name",
"password": "pwd",
"warehouse": "WH",
"role": "ANALYST",
"database": "DB",
"SCHEMA": "schema"
}
o_snowpark_session = Session.builder.configs(s_conStr).create()
current_db = o_snowpark_session.sql("SELECT CURRENT_DATABASE()").collect()
print(current_db)
data = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
final_data1 = pd.DataFrame(data)
o_snowpark_session.sql("SHOW PARAMETERS LIKE 'AUTOCOMMIT';").show()
o_snowpark_session.sql("alter session set AUTOCOMMIT=True").show()
o_snowpark_session.sql("SHOW PARAMETERS LIKE 'AUTOCOMMIT';").show()
o_snowpark_session.write_pandas(final_data1, "TEST_INSERT")
上面的代码将为会话设置 AUTOCOMMIT 参数 true。
# create or replace table MY_TABLE_NAME
# ("calories" number, "duration" number);
import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col
import pandas as pd
def main(session: snowpark.Session):
data = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
data = pd.DataFrame(data)
print(data)
session.write_pandas(df=data, table_name='MY_TABLE_NAME')
session.write_pandas(df=data, table_name='MY_TABLE_NAME')
session.write_pandas(df=data, table_name='MY_TABLE_NAME')
return "Done"
但是我无法重现您的问题。我不需要设置任何自动提交。也许您可以分享更多详细信息或查看查询历史记录。