sql >> データベース >  >> RDS >> PostgreSQL

sqlalchemyのPostgresqlONCONFLICT

    Postgres 9.6.1、sqlachemy 1.1.4、およびpsycopg2 2.6.2の使用:

    1. データ構造を辞書に変換します。パンダからは

      import pandas
      from sqlalchemy import MetaData
      from sqlalchemy.dialects.postgresql import insert
      import psycopg2
      
      # The dictionary should include all the values including index values
      insrt_vals = df.to_dict(orient='records')
      
    2. sqlalchemyを介してデータベースに接続します。代わりに、下にあるpsycog2ドライバーと、すべてのpostgresインデックスをバイパスするネイティブのCOPY関数を試してください。

      csv_data = os.path.realpath('test.csv')
      con = psycopg2.connect(database = 'db01', user = 'postgres')
      cur = con.cursor()
      cur.execute("\copy stamm_data from '%s' DELIMITER ';' csv header" % csv_data)
      con.commit()
      
    3. 実行

      results = engine.execute(do_nothing_stmt)
      # Get number of rows inserted
      rowcount = results.rowcount
      

    警告:

    この方法はNaTでは機能しません 箱から出してすぐに使用できます。

    すべて一緒に

    tst_df = pd.DataFrame({'colA':['a','b','c','a','z', 'q'],
                  'colB': pd.date_range(end=datetime.datetime.now() , periods=6),
                  'colC' : ['a1','b2','c3','a4','z5', 'q6']})
    
    
    insrt_vals = tst_df.to_dict(orient='records')
    engine =      sqlalchemy.create_engine("postgresql://user:[email protected]/postgres")
    connect = engine.connect()
    meta = MetaData(bind=engine)
    meta.reflect(bind=engine)
    table = meta.tables['tstbl']
    insrt_stmnt = insert(table).values(insrt_vals)
    
    do_nothing_stmt  = insrt_stmnt.on_conflict_do_nothing(index_elements=['colA','colB'])
    results = engine.execute(do_nothing_stmt)
    

    手順2と3の代わりに、psycog2を使用します postgresでcopyコマンドを使用するドライバーは、すべてのテーブルインデックスをオフに設定するため、大きなファイル(ギグに近づく)の場合は高速です。

    csv_data = os.path.realpath('test.csv')
    


    1. MySQL LEFT JOIN、GROUP BY、およびORDERBYが必要に応じて機能しない

    2. エンティティフレームワークは、where句に追加の条件を追加します

    3. mysqlの列に複数のアイテムを保持する

    4. MySql警告をトラップする