【发布时间】:2020-08-02 22:12:33
【问题描述】:
我一直在尝试从 python 向 MYSQL 表中插入数据。我的sql表中的字段是id、token、start_time、end_time、no_of_trans。
我想将使用uuid4 生成的令牌存储在令牌列中。但由于该值包含(-),我收到此错误:
mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column '3900af75' in 'field list''
其中生成的令牌是:3900af75-4563-4c05-81ba-b0f1630abecc
而且我还尝试以字符串格式插入日期,但也不起作用。所以我明确地将日期值作为字符串传递:
mycursor.execute("""INSERT INTO generate (token, start_time, end_time, no_of_trans) VALUES (%s, %s, %s, %s)""" %(rand_token, '2020-04-20', '2020-04-20', 3))
它将数据插入表中,但日期被视为整数,存储的值是1996,从我过去的日期算起,它只不过是2020-04。
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| token | varchar(255) | YES | | NULL | |
| start_time | varchar(255) | YES | | NULL | |
| end_time | varchar(255) | YES | | NULL | |
| no_of_trans | int(20) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
【问题讨论】:
-
字符串文字必须用单引号字符
'括起来。 -
什么是INSERT INTO 生成(
12, start_time, end_time ...? -
@Akina 我认为这里的问题是 Python UUID。我不确定语句 API 是否足够聪明,无法弄清楚如何绑定它。
-
我认为您要查找的语法是
mycursor.execute("""INSERT INTO generate (token, start_time, end_time, no_of_trans) VALUES (%s, %s, %s, %s)""", (rand_token, '2020-04-20', '2020-04-20', 3))注意,,而不是% -
查看@Nick 发表的评论。如果您打算像当前一样使用
%运算符进行字符串格式化,那么您需要用引号将对应于字符串值的每个%s括起来,即VALUES ('%s', '%s', '%s', %s)。但是当输入是“来自外部”时防止 SQL 注入攻击的准备好的语句是要走的路。
标签: mysql mariadb mysql-python mysql-connector