【问题标题】:Python pymysql dynamic binding the variable value to database fieldPython pymysql 将变量值动态绑定到数据库字段
【发布时间】:2018-12-13 04:00:42
【问题描述】:

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

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 查询肯定会遇到错误。即仅文档['name'] 存在于文档变量中

有没有想过要处理这个以获得高效的代码?

【问题讨论】:

    标签: python mysql pymysql


    【解决方案1】:

    通常情况下,像 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)
    

    【讨论】:

    • 谢谢,@alecxe,您好,如何将文档密钥 (zipCode) 重命名为表格列 (zip_code) 作为您的方法?假设是否有不同的文档键映射到不同的表列名。
    • @JohnnyCc 啊,是的,这种状态下的解决方案需要document 中的键名来匹配表列。您可以添加一个额外的字典来映射事情,如果问题相对较小可能没问题。您也可以切换到使用位置占位符,但您仍然需要知道每个位置的列名。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2018-11-07
    • 1970-01-01
    • 2013-07-08
    • 2022-01-23
    相关资源
    最近更新 更多