Python中往MySQL存入时间"2018-05-16 23:28:13"报错ProgrammingError: (1064, ...)是什么格式问题?
MySQL 数据格式设为 varchar 和 datetime 都存不进去:
login_time = "2018-05-16 23:28:13"
cursor.execute("insert into user_logs (user_id, login_time) values (%s, %s)" % \
(int(user_id), login_time))
出错提示( MySQL5.5):
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '23:28:13)' at line 1")
Python中往MySQL存入时间"2018-05-16 23:28:13"报错ProgrammingError: (1064, ...)是什么格式问题?
引号问题吧,第二个 %s 用引号包起来
这个报错是SQL语法问题,通常是因为时间字符串格式不对或者没加引号。
看看你的代码是不是这样写的:
# 错误示例 - 直接拼接字符串
sql = f"INSERT INTO table (time_field) VALUES ({time_str})"
cursor.execute(sql)
应该用参数化查询:
import pymysql
from datetime import datetime
# 正确的写法
conn = pymysql.connect(host='localhost', user='root', password='', database='test')
cursor = conn.cursor()
time_str = "2018-05-16 23:28:13"
# 方法1:直接传字符串(MySQL会自动转换)
sql = "INSERT INTO your_table (time_column) VALUES (%s)"
cursor.execute(sql, (time_str,))
# 方法2:转换成datetime对象
dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
cursor.execute(sql, (dt,))
conn.commit()
关键点:
- 必须用参数化查询(
%s占位符),不要直接拼接SQL字符串 - 时间字段在SQL中要用单引号包裹,参数化查询会自动处理
- 确保MySQL表中的时间字段类型是
DATETIME或TIMESTAMP
如果你直接拼接SQL,生成的语句会是:
-- 错误:缺少引号
INSERT INTO table (time_field) VALUES (2018-05-16 23:28:13)
-- 正确:有引号
INSERT INTO table (time_field) VALUES ('2018-05-16 23:28:13')
改成参数化查询就能解决。
总结:用参数化查询替代字符串拼接。
login_time = "2018-05-16 23:28:13"
cursor.execute(“insert into user_logs (user_id, login_time) values (%s, ‘%s’)” % <br> (int(user_id), login_time))
<br>cursor.execute("insert into user_logs (user_id, login_time) values (%s, %s)", (int(user_id), login_time))<br>
这样应该可以了吧。
不要自己通过字符串格式化的方式填充参数生成 SQL,这样除了容易拼错引号之类的导致语法错误外还很容易引入 SQL 注入漏洞。
楼主最好不要这么写,很容易被 SQL 注入,应该用参数化方式, 那个 int ()转换也是多余的。
直接写成下面这样就可以了。
cursor.execute(“insert into user_logs (user_id, login_time) values (%s, %s)”, (user_id, login_time))
你可以把 sql 语句打出来看看,vules 没有引号的话貌似会报语法错误。昨天刚碰到这个问题。最后加了个转义符搞定。
我应该是某个地方格式写错了,谢谢楼上同学,用字符串加’'和传参的方式都可以。


