我正在尝试动态绑定要插入数据库表列的变量值。
json中的变量值示例:
document= {'zipCode': '99999',
'name': 'tester',
'company': 'xxxx'}
我的数据库表列为:
表名:table1
列:ID,邮政编码,名称,公司
我在python中的代码:
with connection.cursor() as cursor:
sql = "INSERT INTO table1(zip_code, name, company) VALUES (%s,%s,%s)"
cursor.execute(sql,(document['zipCode'],
document['name'],
document['company']))
connection.commit()
但是,如果缺少文档中的键值之一,则肯定是INSERT查询会遇到错误。即文档变量中仅存在document ['name']
有人想到要处理此代码以获得高效代码吗?
答案 0 :(得分:0)
通常,SQLAlchemy
或Peewee
之类的ORM可以很轻松地为您解决问题。
但是,如果要实现,我可能会根据可用的密钥来做一些“动态”的事情:
QUERY = "INSERT INTO table1({columns}) VALUES ({values})"
def get_query(document):
columns = list(document.keys())
return QUERY.format(columns=", ".join(columns),
values=", ".join('%({})s'.format(column) for column in columns))
样品用量:
In [12]: get_query({'zipCode': '99999', 'name': 'tester', 'company': 'xxxx'})
Out[12]: 'INSERT INTO table1(company, zipCode, name) VALUES (%(company)s, %(zipCode)s, %(name)s)'
In [13]: get_query({'name': 'tester'})
Out[13]: 'INSERT INTO table1(name) VALUES (%(name)s)'
然后,您只需使用document
字典对查询进行参数化,因为我们已经在查询中创建了命名占位符:
cursor.execute(get_query(document), document)