web-dev-qa-db-ja.com

Pandas to_sqlがテーブルにデータを挿入しない

作成したテーブルにデータを挿入しようとしています。次のようなデータフレームがあります。

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')

エラーは発生しませんが、チェックすると、テーブルにデータがありません。何が悪いのでしょうか?コミットするか、追加の手順を実行する必要がありますか?

12
Nasia Ntalla

スキーマ名を指定してみてください:

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

うまくいけば、これは他の誰かを助けます。 _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(),を渡してみてください

2
lewk

autocommit設定を確認します。 https://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit

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

.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()を削除するだけで機能します。

0
Flavio

engineオブジェクトではなくsqlalchemy connectionオブジェクトをconパラメータに渡していたため、同様の問題が発生しました。私の場合、テーブルは作成されましたが、空のままにされました。

0
PierluigiPuce

これは、デフォルトでパブリックデータベースに設定されており、データが含まれているパブリックデータベース/スキーマの下にその名前のテーブルが存在する可能性があるために発生する可能性があります。

@MaxUの回答は一部の人を助けますが、他の人を助けません。他の人のために、ここにあなたが試すことができる他のものがあります:

エンジンを作成するときに、次のようにスキーマ名を指定します。

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

リンク: https://stackoverflow.com/a/49930672/8656608

0
being_felicity

私も同じような状況です。 pandasデータフレームをOracleテーブルに挿入できません。cx_OracleとSQLalchemyをOracle接続に使用しています。エラーはありません。次のコマンドを使用しています:

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