【问题标题】:MySQL/Python can't insert dict into databaseMySQL/Python 无法将字典插入数据库
【发布时间】:2020-12-28 15:53:54
【问题描述】:

我目前在使用 python 插入 MYSQL DB 时遇到问题。下面的执行语句没有运行,这是我使用 print stmts 发现的。

这对我来说是个谜,因为在使用相同的代码时,我的朋友可以插入到他们的数据库中(当然使用适当的 mysql 主机、密码等以及相同的 mysql 和 python 版本)

mycursor.execute("""
            INSERT INTO emailcontent (Subject, Date, Sender, Sendee, Message_body)
            VALUES (%(Subject)s, %(Date)s, %(Sender)s, %(To)s, %(Message_body)s)
            """, temp_dict)
            mydb.commit()

temp_dict 示例数据:

{'Subject': 'Security alert', 'Date': '2020-12-28', 'Sender': 'Google <no-reply@accounts.google.com>', 'Snippet': 'Quickstart was granted access to your Google Account sometestemail@gmail.com If you did not grant access, you should check this activity and secure your account. Check activity You can also see security', 
'To': 'sometestemail@gmail.com'}

其他代码:

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="database"
)

mycursor = mydb.cursor()

版本

Python 3.9.1

mysql 8.0.22

mysql-connector 2.2.9

【问题讨论】:

  • 您声明查询“未运行”,但未发布回溯。你能用遇到的任何和所有异常来更新你的问题吗?最好注意您正在使用哪个 mysql 客户端 python 库(带有版本)。同时,您会发现用户@furicle 对此问题的回答很有帮助:stackoverflow.com/questions/9336270/…
  • 您以错误的方式使用python字符串格式请尝试mycursor.execute(""" INSERT INTO emailcontent (Subject, Date, Sender, Sendee, Message_body) VALUES ({Subject}, {Date}, {Sender}, {Sendee}, {Message_body}) """.format(Subject: temp_dict["Subject"], Date: temp_dict["Date"])) mydb.commit()并以类似方式写入剩余值
  • @SanthoshReddy OP 正在使用正确的语法。您应该从不对 SQL 查询中的值使用字符串格式。
  • 知道了,我们必须在执行查询中给出值列表

标签: python mysql python-3.x


【解决方案1】:

您的字典中没有 Message_body 项目。 你确实有Snippet。试试看。

【讨论】:

    【解决方案2】:

    参考 furicle 在此处发布的答案 Using a Python dict for a SQL INSERT statement

    使用以下方法成功插入:

    table = 'emailcontent'
                
    placeholders = ', '.join(['%s'] * len(temp_dict))
    columns = ', '.join(temp_dict.keys())
    sql = "INSERT INTO emailcontent (Subject, Date, Sender, Sendee, Message_body) VALUES ( %s )" % (placeholders)
    
    mycursor.execute(sql, list(temp_dict.values()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2011-02-07
      • 2018-10-14
      • 2020-12-14
      • 2013-04-28
      相关资源
      最近更新 更多