【问题标题】:MySQLdb Python insert %d and %sMySQLdb Python 插入 %d 和 %s
【发布时间】:2013-12-26 03:10:06
【问题描述】:

前身:

MySQL Table created via:
CREATE TABLE table(Id INT PRIMARY KEY NOT NULL, Param1 VARCHAR(50))

功能:

.execute("INSERT INTO table VALUES(%d,%s)", (int(id), string)

输出:

TypeError: %d format: a number is required, not a str

我不确定这里发生了什么或为什么我无法执行该命令。这是在 Python 中使用 MySQLdb。 .execute 在光标对象上执行。

编辑:

问题:Python MySQLdb issues (TypeError: %d format: a number is required, not str) 表示您必须对所有字段使用%s。为什么会这样?为什么这个命令有效?

.execute("INSERT INTO table VALUES(%s,%s)", (int(id), string)

【问题讨论】:

  • 您缺少%) - .execute("INSERT INTO table VALUES(%d,%s)"% (int(id), string))

标签: python mysql mysql-python


【解决方案1】:

由于在执行查询时整个查询需要采用字符串格式,所以应该使用%s...

查询执行后保留整数值。

所以你的线应该是。

.execute("INSERT INTO table VALUES(%s,%s)", (int(id), string))

解释是here

【讨论】:

  • 我在 python 2.7 上收到了类似语法的错误。至少在我这边,如果需要一个参数化的 %s,我的 python 需要一个字符串值,我不得不将它转换为类似 str(someVal) 的字符串。
  • @Kickass - 您可能需要检查是否有一个字符串插值运算符 (%) 将您的 SQL INSERT 字符串和值元组分开而不是逗号。
  • @xor 如何仅使用一列来执行此操作?我的 ID 是 Autoincrement。所以我不需要添加它。只需添加字段“Param1”(如此处的示例)。 mycursor.execute("INSERT INTO mytable Param1 VALUES %s", (name))。但它一直在%s 处显示语法错误。我也试过(%s)。没用
  • @Priya 我在这里找到了解决方案:stackoverflow.com/questions/41309096/…
【解决方案2】:

格式字符串并不是真正的普通 Python 格式字符串。您必须始终对所有字段使用 %s

【讨论】:

    【解决方案3】:

    我在dev.mysql.com 上找到了解决方案。简而言之,在.execute()的第二个参数中使用dict,而不是tuple

    add_salary = ("INSERT INTO salaries "
                  "(emp_no, salary, from_date, to_date) "
                  "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")
    
    data_salary = {
      'emp_no': emp_no,
      'salary': 50000,
      'from_date': tomorrow,
      'to_date': date(9999, 1, 1),
    }
    
    cursor.execute(add_salary, data_salary)
    

    【讨论】:

      【解决方案4】:

      您在字符串格式中错过了'%'

      "(INSERT INTO table VALUES(%d,%s)"%(int(id), string))
      

      【讨论】:

      • 我很抱歉这被否决了,但这是一个前进的答案("INSERT INTO table VALUES(%d,'%s')"%(int(id), string))你应该编辑它
      • 已编辑。谢谢。
      • 养成使用cursor.execute函数的参数来消除注入风险的习惯要安全得多:stackoverflow.com/a/775399/6284025
      猜你喜欢
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2018-05-11
      • 2023-03-26
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      相关资源
      最近更新 更多