我正在尝试动态绑定要插入数据库表列的变量值。
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']
有什么想法可以处理高效代码吗?
最佳答案
通常,这是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)