我正在尝试在我创建的表中插入一些数据。 我有一个如下所示的数据框:
我创建了一个表:
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')
我没有收到错误,但是当我检查表格中没有数据时。有什么不对?我是否必须承诺或采取额外措施?
答案 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>*)})
答案 7 :(得分:0)
我有一个类似的问题,原因是我将sqlalchemy connection 对象而不是 engine 对象传递给 con 参数。在我的情况下,表已创建但留空。