Python pymysql动态将变量值绑定到数据库字段

时间:2018-12-13 04:00:43

标签: python mysql pymysql

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

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

有人想到要处理此代码以获得高效代码吗?

1 个答案:

答案 0 :(得分:0)

通常,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)