Pandas to_sql不会在我的表中插入任何数据

时间:2018-01-17 17:43:24

标签: python pandas sqlalchemy

我正在尝试在我创建的表中插入一些数据。 我有一个如下所示的数据框:

dataframe

我创建了一个表:

create table online.ds_attribution_probabilities
(
attribution_type text,
channel text,
date date ,
value float
)

我正在运行这个python脚本:

engine = create_engine("postgresql://@e.eu-central-1.redshift.amazonaws.com:5439/mdhclient_encoding=utf8")
connection = engine.raw_connection()
result.to_sql('online.ds_attribution_probabilities', con=engine, index = False, if_exists = 'append')

我没有收到错误,但是当我检查表格中没有数据时。有什么不对?我是否必须承诺或采取额外措施?

8 个答案:

答案 0 :(得分:5)

尝试指定架构名称:

result.to_sql('ds_attribution_probabilities', con=engine, 
              schema='online', index=False, if_exists='append')

答案 1 :(得分:1)

检查autocommit设置:https://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit

engine.execute(text("SELECT my_mutating_procedure()").execution_options(autocommit=True))

答案 2 :(得分:1)

希望这对其他人有帮助。如果您传递连接对象,to_sql将以看起来像是成功插入的形式静默失败。对于Postgres绝对是正确的,但是基于docs方法,我也对其他人也假设相同:

con : sqlalchemy.engine.Engine or sqlite3.Connection
    Using SQLAlchemy makes it possible to use any DB supported by that
    library. Legacy support is provided for sqlite3.Connection objects.

之所以得到我,是因为键入提示指出了Union[Engine, Connection],这在技术上是正确的。

如果您与SQLAlchemy进行会话,请尝试传递con=session.get_bind(),

答案 3 :(得分:1)

以我为例,快速选项妨碍了将数据写入数据库。

为什么这种加载速度不快,我还没有弄清楚。

此代码无效:

engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={}".format(db_params), fast_executemany=True)
df.to_sql('tablename', engine, index=False, schema = 'dbo', if_exists='replace' )

在没有fast_executemany=True的情况下,代码可以正常工作。

答案 4 :(得分:0)

我也有类似情况。无法将pandas数据框插入到oracle表中。我将cx_oracle和SQLalchemy用于oracle连接。没有错误。我正在使用以下命令:

pd_df.to_sql('abc.xyz', conn, schema = 'abc', if_exists='replace', index='false')

答案 5 :(得分:0)

使用.connect().begin()时遇到相同的问题

with engine.connect() as conn, conn.begin():
         dataframe.to_sql(name='table_name', schema='schema',
         con=conn, if_exists='append', index=False)
         conn.close()

只需删除.connect().begin(),它就会起作用。

答案 6 :(得分:0)

之所以会发生这种情况,是因为它默认为公共数据库,并且在公共数据库/模式下可能有一个名称相同的表,其中包含您的数据。

@MaxU的回答确实对某些人有所帮助,但对其他人没有帮助。 对于其他人,您可以尝试以下操作:

创建引擎时,请按以下方式指定架构名称:

engine = create_engine(*<connection_string>*,
    connect_args={'options': '-csearch_path={}'.format(*<dbschema_name>*)})

链接:https://stackoverflow.com/a/49930672/8656608

答案 7 :(得分:0)

我有一个类似的问题,原因是我将sqlalchemy connection 对象而不是 engine 对象传递给 con 参数。在我的情况下,表已创建但留空。