作成したテーブルにデータを挿入しようとしています。次のようなデータフレームがあります。
私はテーブルを作成しました:
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')
エラーは発生しませんが、チェックすると、テーブルにデータがありません。何が悪いのでしょうか?コミットするか、追加の手順を実行する必要がありますか?
スキーマ名を指定してみてください:
result.to_sql('ds_attribution_probabilities', con=engine,
schema='online', index=False, if_exists='append')
うまくいけば、これは他の誰かを助けます。 _to_sql
_は、接続オブジェクトを渡した場合、挿入が成功したように見える形で警告なしに失敗します。これは間違いなくPostgresに当てはまりますが、メソッドのドキュメントに基づいて、他の人にも同じことを想定しています。
_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(),
を渡してみてください
autocommit
設定を確認します。 https://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit
engine.execute(text("SELECT my_mutating_procedure()").execution_options(autocommit=True))
.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()
を削除するだけで機能します。
engineオブジェクトではなくsqlalchemy connectionオブジェクトをconパラメータに渡していたため、同様の問題が発生しました。私の場合、テーブルは作成されましたが、空のままにされました。
これは、デフォルトでパブリックデータベースに設定されており、データが含まれているパブリックデータベース/スキーマの下にその名前のテーブルが存在する可能性があるために発生する可能性があります。
@MaxUの回答は一部の人を助けますが、他の人を助けません。他の人のために、ここにあなたが試すことができる他のものがあります:
エンジンを作成するときに、次のようにスキーマ名を指定します。
engine = create_engine(*<connection_string>*,
connect_args={'options': '-csearch_path={}'.format(*<dbschema_name>*)})
私も同じような状況です。 pandasデータフレームをOracleテーブルに挿入できません。cx_OracleとSQLalchemyをOracle接続に使用しています。エラーはありません。次のコマンドを使用しています:
pd_df.to_sql('abc.xyz', conn, schema = 'abc', if_exists='replace', index='false')