为什么sqlalchemy可以从jupter笔记本插入到雪花,而python连接器却不起作用?

时间:2019-12-27 19:35:48

标签: python jupyter-notebook snowflake-data-warehouse

现在我可以在ipython3笔记本中使用连接了,我正在测试使用python连接器插入和选择数据。但是,当我对此进行测试时,遇到了从python连接器插入数据帧的正确方法的问题,最终我发现sqlalchemy引擎起作用了:https://support.snowflake.net/s/question/0D50Z00009C6023SAB/how-can-i-insert-data-into-snowflake-table-from-a-panda-data-frame

但是现在我很好奇我是否也可以使用python连接器。我在笔记本中包含了以下代码。我不理解该错误消息,当我查找该错误消息时,我尝试了.to_sql https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html中的几个attributef,老实说,我在错误中有些失落,只使用了sqlalchemy方法。如果我需要使python连接正常工作以插入或追加数据,您之前见过此错误吗?我确定这只是一个编码错误。

此方法有效,但是尝试df_to_sql时,仅使用python连接就一直出现错误

mkdir target/dependency
(cd target/dependency; jar -xf ../*.jar)

带有python连接器和

的第二种方法

from sqlalchemy import create_engine

#df_data
data = pd.read_csv("data/data.csv")
data.head()
df_data = pd.DataFrame(data)
df_data=df_data.rename(columns = {'Updated ?':'updated'})
df_data=df_data.rename(columns = {'Article Id':'article_id'})

engine = create_engine(URL(
    account = ACCOUNT,
    user = USER,
    password = PASSWORD,
    database = 'testdb',
    schema = 'public',
    warehouse = 'MYWH',
    role='ACCOUNTADMIN',
))
 
connection = engine.connect()
 
df_data.to_sql('testtb2', con=engine, index=False) #make sure index is False, Snowflake doesnt accept indexes
 
connection.close()
engine.dispose()

  

import snowflake.connector

conn = snowflake.connector.connect(
  user=USER,
  password=PASSWORD,
  account=ACCOUNT)

conn.cursor().execute("create or replace table testtbl(article_id string, link string, status string)")
conn.cursor().execute("begin")
df_data.to_sql('testtbl', con=conn, schema ='testdb.testschema', dtype='varchar', method=None, if_exists='append',index=False) #make sure index is False, Snowflake doesnt accept indexes


conn.close()

1 个答案:

答案 0 :(得分:1)

如我所见,Pandas to_sql函数接受“ sqlalchemy.engine.Engine”和“ sqlite3.Connection”对象作为连接。当您尝试使用雪花连接对象时,它假定它是sqlite3.Connection对象,因此会出现以下错误:

  

pandas.io.sql.DatabaseError:对sql'SELECT name FROM执行失败    sqlite_master ,其中type ='table'AND name = ?;':并非所有参数   在字符串格式化期间转换

如果要使用Pandas to_sql函数,则需要使用SQLAlchemy引擎。