2017-01-12 7 views
0

私はPython 2.7を使用してMS SQL 2012 DBでCRUD操作を実行しています。Pymssqlは動的列名を持つ辞書のリストから複数を挿入します

辞書のリスト「NewComputers」(各辞書はデータベースの行です)にデータが格納されています。

これは正常に動作しています。ただし、ソースデータ列名と宛先列名の両方がハードコードされています(列名が異なることに注意してください)。

質問:データソースの列名をハードコードする代わりに、辞書をループして列名を動的に決定する方法を教えてください。また、宛先(データベーステーブル)の列名をハードコードする代わりに、どのように列名のリストを動的にループすることができますか?

この関数を異なるデータソースの列と宛先の列に再利用したいと考えています。言い換えれば

"INSERT INTOコンピュータ(列名のパラメータ化さLIST)VALUES(値のパラメータ化さLIST)" ここ

が関数である:

def insertSR(NewComputers): 
    conn = pymssql.connect(mssql_server, mssql_user, mssql_pwd, "Computers") 
    cursor = conn.cursor(as_dict=True) 
    try: 
     cursor.executemany("INSERT INTO Computer (ComputerID, HostName, Type) VALUES (%(computer_id)s, %(host_name)s, %(type)s)", NewComputers) # How to make the column names dynamic? 
    except: 
     conn.rollback() 
     print("ERROR: Database Insert failed.") 
    conn.commit() 
    print("Inserted {} rows successfully".format(cursor.rowcount)) 
    conn.close() 

答えて

1

することができます」あなたがしたいことをしないでください。あなたが見ることができるように、あなたは、少なくとも先の列グループごとに1つの別のクエリを作成する必要がありますので、

insert into table (column1, column2, column3) values (a1,a2,a3), (b1,b2,b3) 

基本的には、あなたの複数の挿入SQLクエリはに翻訳されます。

データソース側では、例では(a1,a2,a3),(b1,b2,b3)を指定する必要はありません。そのため、特定の宛先に対して異なるデータソースを使用することができます。この部分では

が、私はこのような何かをしたい:

まずcorrespondanceの辞書を構築し、キーは、宛先フィールド名で、値がデータソーステーブルにこの分野に使用される他の名前です。

source_correspondance = { 
      'ComputerID':['id_computer', 'computer_Id'], 
      'HostName': ['host', 'ip', 'host_name'], 
      'Type':['type', 'type'] 
} 

次に、データソースを反復処理して、列名を対応ディクテーションのキーで置き換えます。

最後に、クエリを作成することができます(宛先 'タイプ'ごとに1つのexecutemany)。

関連する問題