我正在使用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()
答案 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执行一次)。