我正在尝试动态绑定要插入数据库表列的变量值。

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']

有什么想法可以处理高效代码吗?

最佳答案

通常,这是SQLAlchemyPeewee这样的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)

07-24 09:47
查看更多