【问题标题】:From Python to MySQL upload data failed从 Python 到 MySQL 上传数据失败
【发布时间】:2017-04-19 16:55:24
【问题描述】:

下表是我的MySQL字段数据

名为infor的表

+-------------+-------------+------+-----+-------------------+----------------+
| Field       | Type        | Null | Key | Default           | Extra          |
+-------------+-------------+------+-----+-------------------+----------------+
| id          | bigint(7)   | NO   | PRI | NULL              | auto_increment |
| temperature | varchar(20) | YES  |     | NULL              |                |
| wet         | varchar(20) | YES  |     | NULL              |                |
| created     | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+-------------+------+-----+-------------------+----------------+

当我想将数据上传到我的 MySQL 服务器时

我使用以下代码:

temperature_item = '8.7`c'
wet_item = '0.87%'
cur.execute("INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)")

然后它显示以下错误:

pymysql.err.InternalError: (1054, "'field list' 中的未知列 'wet_item'")

但是当我输入时:

cur.execute("INSERT INTO infor (temperature,wet) VALUES ('87`c','8.7%')")

它可以工作,我已经搜索了上一个问题

我是否添加了不可打印的单词?还是其他问题?

【问题讨论】:

  • 你试过我的答案了吗?
  • 谢谢它成功了!!!
  • 不客气。我很高兴能帮上忙。由于您还是新手,我可以指出,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦您有足够的声誉这样做),并接受最有用的答案回答您提出的任何问题(这也可以稍微提升您的声誉)。 When someone answers

标签: python mysql python-3.x


【解决方案1】:
"INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)"

这是一条蟒蛇string literal。您的cur.execute 语句完全等同于在 mysql 控制台输入以下内容。

INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)

现在你在 mysql 中定义了一个 wet_item 吗?不,所以上面的错误是结果。

这也是一个字符串字面量

"INSERT INTO infor (temperature,wet) VALUES ('87c','8.7%')"

但是在这里你将常量传递给 mysql,它可以很容易地处理它。如果您想将变量传递给 mysql,则正确的形式是

cur.execute("INSERT INTO infor (temperature,wet) VALUES(%s, %s)", (temperature_item,wet_item))

【讨论】:

  • 谢谢!!!这个很有用^^ 但是为什么执行sql语句后,sql server没有捕获到任何数据?
  • 抱歉我没看懂那条评论
  • 在最后一次查询后执行cur.commit()。
  • @RobinKoch op 没有说他正在使用交易,所以我保持简单
【解决方案2】:

我不是很了解python,但是https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html,看来你执行的时候应该传参数。

所以如果你试试这个:

query = ("INSERT INTO infor (temperature,wet) VALUES (%s,%s)")
temperature_item = '8.7`c'
wet_item = '0.87%'

cursor.execute(query, (temperature_item, wet_item))

【讨论】:

【解决方案3】:

Python 在字符串中没有变量扩展。所以在

cur.execute("INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)")

Python 确实不将变量名替换为它的值。 (python 甚至应该知道你什么时候想要那个?)

python中一般的解决方案是.format()方法:

s = "World"
print("Hello {}".format(s))

用s的值替换花括号。

但是在这个特定的例子中(使用数据库),更好的解决方案是

cur.execute("INSERT INTO infor (temperature,wet) VALUES(%s, %s)", (temperature_item,wet_item))

这是数据库接口插入变量值的方式。 这是更好的方法,因为它还可以确保不会发生这种情况:

temperature_item = "87c"
wet_item = "8.7%'); DROP TABLE infor; --"
cur.execute("INSERT INTO infor (temperature,wet) VALUES('{}', '{}')".format(temperature_item, wet_item))

这会很糟糕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2019-02-11
    • 1970-01-01
    • 2018-06-30
    • 2022-06-11
    相关资源
    最近更新 更多