【问题标题】:Mysqldb and Python KeyError HandlingMysqldb 和 Python KeyError 处理
【发布时间】:2016-09-19 11:35:40
【问题描述】:

我正在尝试向 MySQL 表中添加多个值,代码如下:

Try:
cursor.execute("INSERT INTO companies_and_charges_tmp (etags, company_id,  created, delivered, satisfied, status, description, persons_entitled) VALUES ('%s, %s, %s, %s, %s, %s, %s, %s')" % (item['etag'], ch_no, item['created_on'], item['delivered_on'], item['satisfied_on'], item['status'], item['particulars'][0]['description'], item['persons_entitled'][0]['name']))

Except KeyError:
    pass

问题是这段代码在循环中,有时正在插入的值之一会丢失,这将导致 Key Error 取消整个插入。

如何通过 KeyError,所以当与正在插入的项目之一相关的 KeyError 发生时,其他项目仍会添加到表中,而缺少的项目只是保留为 NULL?

【问题讨论】:

    标签: python mysql sql-insert mysql-python


    【解决方案1】:

    您可以使用dict.get() method,如果在字典中找不到键,它将返回None。然后MySQL 驱动程序将在查询参数化步骤中将None 转换为NULL

    # handling description and name separately
    try:
        description = item['particulars'][0]['description']
    except KeyError:
        description = None
    
    # TODO: violates DRY - extract into a reusable method?
    try:
        name = item['persons_entitled'][0]['name']
    except KeyError:
        name = None
    
    cursor.execute("""
         INSERT INTO 
             companies_and_charges_tmp 
             (etags, company_id,  created, delivered, satisfied, status, description, persons_entitled) 
         VALUES 
             (%s, %s, %s, %s, %s, %s, %s, %s)""", 
         (item.get('etag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, name))
    

    【讨论】:

    • 工作就像一个魅力,谢谢!只是好奇,为什么你必须分别处理描述和名称?
    • 对不起,我说得太早了。现在,当我通过循环运行它时,我收到了这个错误:在赋值之前引用了局部变量“item”
    • @KamilMieczakowski 必须分别处理名称和描述,因为它涉及从子词典中获取项目。至于错误,请确保在使用它之前定义了“项目”。谢谢。
    • 谢谢。不幸的是,我正在努力解决如何引用 item 变量,因此我发布了另一个问题。如果您知道上下文可以提供帮助,我将不胜感激:stackoverflow.com/questions/37377695/…
    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2011-07-02
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多