Pymssql从具有动态列名的字典列表中插入多个

时间:2017-01-12 17:58:33

标签: python python-2.7 pymssql

我正在使用python 2.7在MS SQL 2012数据库上执行CRUD操作。

我将数据存储在词典列表“NewComputers”中(每个词典都是数据库中的一行)。

这是正常的。但是,源数据列名称和目标列名称都是硬编码的(请注意列名称不同)。

问题:如何循环字典以动态确定列名,而不是硬编码数据源列名?此外,不是硬编码目标(数据库表)列名称,而是如何动态循环列名列表?

我想让这个函数可以重用于不同的数据源列和目标列。

换句话说:

“插入计算机(列名称的参数化列表)值(参数化的值列表)”

这是功能:

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 个答案:

答案 0 :(得分:1)

你不能做你想做的事。

基本上,您的多个插入SQL查询将转换为:

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

正如您所看到的,您至少必须为每个目标列组创建一个不同的查询。

然后在我的示例中的数据源端(a1,a2,a3),(b1,b2,b3),您不必指定列名,因此您可以为给定目标提供不同的数据源。

在这一部分,我会做这样的事情:

首先构建一个对应的dict,key是目标字段名,值是数据源表中该字段使用的其他名称:

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

然后遍历您的数据源,并用对应字典的键替换列名。

然后最后你可以建立你的查询(每个目的地'类型'1执行一次)。