Pythonはデータベースの挿入とクエリーのいくつかの問題と解決策を処理します


文書ディレクトリ
  • Python接続DB 2
  • ibm_を使用dbとibm_db_sa 2つのパッケージ
  • ibm_を使用db_saとsqlalchemyの2つのパッケージ
  • Python処理挿入データベースレポートデータ型不一致問題
  • Python SQL文の実行に成功しましたが、データベースにはデータがありません.
  • Python大体量のデータを挿入すると一定数の崩壊
  • になる.
    Python接続DB 2
    IBMのDB 2データベースをpythonで接続するのは本当に一般的な面倒ではありません.一つは、このデータベースが現在主流のデータベースではないからです.一方、Sqlalchemyはその内部コードにこの方法を加えていないので、接続が特に面倒になります.公式のヘルプドキュメントとCSDNのチュートリアルを参照して、次の2つの接続方法を整理しました.
    ibm_の使用dbとibm_db_sa 2パック
  • 2 2 2個のパッケージ
  • を取り付ける
    pip install ibm_db
    pip install ibm_db_sa
    
  • 次のコードを使用する接続
  • を作成します.
    import ibm_db,ibm_db_dbi
    
    x=ibm_db.connect("DATABASE=KOALA;HOSTNAME=BTPROD.LENOVO.COM;PORT=50001;PROTOCOL=TCPIP;UID=xux17;PWD=*****","","")
    conn2=ibm_db_dbi.Connection(x)
    

    このメソッドを使用すると、元のSQL文を実行できますが、pandasパッケージと直接使用することはできません.pandasのread_を使用する場合は、sqlメソッドは、次の方法をお勧めします.しかし,データダンプを行う場合には,カーソルを用いて順次一括してデータを読み出すことが考えられる.
    x=ibm_db.connect("DATABASE=KOALA;HOSTNAME=BTPROD.LENOVO.COM;PORT=50001;PROTOCOL=TCPIP;UID=xux17;PWD=***;","","")
    
    conn2=ibm_db_dbi.Connection(x)
    
    sql="SELECT * FROM PC_KPI.PC_INCIDENT_ROOT"
    
    conn1=pymssql.connect(host='10.103.66.45',port=1444,user='sa',password='****,database='Integration')
    cor1=conn1.cursor()
    cor2=conn2.cursor()
    d=cor2.execute(sql)
    data=cor2.fetchmany(1000)
    sql2="""
    INSERT INTO [dbo].[PC_KPI.PC_INCIDENT_ROOT2]
               ([INCIDENT_ID]
               ,[MACHINE_TYPE]
               ,[SERIAL_NBR]
               ,[COUNTRY_CODE]
               ,[CLAIM_NBR]
               ,[SERVICE_DELIVERY_TYPE]
               ,[ENTITLEMENT_TYPE]
               ,[CLAIM_CREATE_TS]
               ,[CLAIM_STATUS]
               ,[CLAIM_CLOSE_TS]
               ,[CLOSE_CODE]
               ,[SEVERITY]
               ,[RES_TYPE_DESC]
               ,[RES_CAT_DESC]
               ,[RES_PROB_DESC]
               ,[RES_RSLT_DESC]
               ,[CALL_RCVD_TYPE])
         VALUES
         (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
    """
    i=1
    while data:
        cor1.executemany(sql2,data)
        conn1.commit()
        print('process %drows'%(i*1000))
        i+=1
        data=cor2.fetchmany(1000)
    

    ibm_の使用db_saとsqlalchemyの2つのパッケージ
    この方法を用いる利点は,読み出したデータをpandasで直接処理でき,後続の解析とデータ処理を容易にすることである.ただし、sqlachemy自体にはこのインタフェースが内蔵されていないため、パッケージをインストールした後、一定の処理が必要です.
  • 以下のパッケージ
  • をインストール
    pip install ibm_db,ibm_db_sa
    
  • python 3.6です.sqlalchemyを直接使用して接続を作成できます.できない場合は、このリンクを参照して、
  • を構成できます.
    import imb_db_sa
    from sqlalchemy import create_engine
    import pandas as pd
    
    DB_CONNECT_STRING1 = 'ibm_db_sa://sa:[email protected]:1444/integration?charset=utf8'
    engine1 = create_engine(DB_CONNECT_STRING1, echo=False)
    DB_Session1 = sessionmaker(bind=engine1)
    session1 = DB_Session1()
    

    Pythonは、データベース・レポートのデータ型が一致しない問題を処理します.
    最近、データ・マーケットを行う過程で、入ってきたデータが規範化されていないことがよく発見され、各列のデータ型が極めて一致していない.この問題の原因は主に前期のデータ生成時にデータ規範ができていないため、後期に分析したデータは常に各種の誤りを報告している.Pythonは、データソースから読み込まれたデータについては、前期のデータに基づいてその列のデータ型が与えられるが、読み込まれたデータには、その列に属さないデータ型が含まれている可能性が高い.例えば、日付型のデータ列にデジタル型が含まれているため、後期にデータベースを挿入する際に、タイプ変換エラーが発生し、データ挿入に失敗する.以上の問題について、以下の集中的な解決方法があります.
  • 行ごとに挿入することで、データエラーの報告中にエラー行も見つかり、修正して挿入を再開することができます.欠点は、プログラム
  • をじっと見つめていることです.
  • 挿入前にデータの照合を行い、変更と更新のために奇異値があるかどうかを確認します.この方法は分析が行き届いていれば,直接自動化を完了することができ,人工変換を省くことができる.しかし、アナリストはデータと業務を十分に理解する必要があります.そうしないと、
  • の調査はできません.
  • すべてのフィールドをto_sqlではvarcharとしてタイプを指定します.これにより、奇異な値があってもエラーが報告されず、データ挿入を簡単に完了でき、データベースでもほとんどのフィールドの分析に影響を与えません.しかし、日付型のデータについては、後で時間比較が必要な場合、このようなデータは
  • と間違って報告されるため、このような操作は推奨されません.
    PythonはSQL文の実行に成功しましたが、データベースにはデータがありません.
    pythonでSQLを実行するとき、sqlalchemyを使用して作成したコネクタにこの問題が発生しました.
  • オリジナルSQLのinsert文を実行すると、プログラムは挿入の進捗状況を表示しますが、プログラムが終了するとデータベースにはデータがありません.
  • dropが表を落とした後に、原始SQL into文を使ってクエリの結果を直接表に保存して間違いを報告しないで、データは
  • 保存します
    多くのブログや資料を調べたが、解決策は見つからなかった.原生SQL文を実行してからcommitを行う必要があるという説がありますが、sqlalchemyにはcommitメソッドはありません.そして、そうであれば、私の2番目の状況は現れません.
    この問題に対して、私の解決方法は:
  • pandasを使用するread_sqlはまずクエリーの結果データを受信し、to_を使用します.sqlを一度挿入します.欠点は、データのデータベースへの挿入が遅くなり、プログラムメモリ
  • を占めることです.
  • データベースのオリジナルパッケージを使用して接続を作成します.たとえばpymssqlはSQLserverの接続を作成します.これにより、SQLを実行するとcommitが有効になります.欠点はpandasとうまく結合できないことです.
    Pythonが大体のデータを挿入すると一定数のクラッシュになる
    会社のデータをデータ・マーケットで作成した際、Pythonを使用して異なる種類のデータベースのデータ移行を行うと、プログラムが一定のデータ量に処理された後、Pythonは直接クラッシュすることがわかります.この問題に対して、ずっと良い解決方法が見つからなかった.結局、データの問題であれば、直接Pythonクラッシュではなく、データ型変換エラーを報告すべきだ.データ量が大きすぎると、私が前に挿入した数百万のデータはもっと早く崩壊するはずです.
    個人的にこの状況が発生する可能性のあるいくつかの原因をまとめます.
  • データには、DB 2とsqlserverが24点と0点に及ぶ時間変換が一致しないため、私の変換がずっと間違っているなどの特殊なデータエラーがあります.このようなデータはエラーデータ型ではありませんが、データを変換できません.挿入を完了するには、文字列に直接変換するしかありませんが、最終的にはこの問題を解決することは避けられません.
  • Pythonプロセスが多すぎてプログラム競合がクラッシュした可能性があります