如何在Python中调用MySQL的CURRENT_TIMESTAMP函数?
在Python中使用MySQL的CURRENT_TIMESTAMP函数插入/更新时间戳
你的问题核心在于把CURRENT_TIMESTAMP当成字符串参数传递给了SQL占位符,参数化查询会自动将这个字符串转义并加上引号,导致MySQL把它当成普通文本而非内置函数,所以才会报Incorrect datetime value错误。
正确的写法:直接在SQL语句中写入CURRENT_TIMESTAMP
不需要通过%s占位符传递,直接把函数写进SQL语句里,MySQL执行时会自动调用该函数获取服务器当前时间:
try: mycursor.execute( "CREATE TABLE IF NOT EXISTS test (pkID bigint unsigned NOT NULL AUTO_INCREMENT , tsTest TIMESTAMP, PRIMARY KEY (pkID));") # 直接在SQL中使用CURRENT_TIMESTAMP,无需参数传递 sqlInsert = "INSERT INTO test (tsTest) VALUES (CURRENT_TIMESTAMP);" mycursor.execute(sqlInsert) # 不需要传入valsInsert参数 except mysql.connector.Error as err: print("MySQL error: {}".format(err))
扩展:UPDATE操作的写法
如果是更新时间戳,逻辑完全一致,函数直接写在SQL中,仅传递需要动态指定的条件参数:
# 更新指定pkID的记录时间戳 sqlUpdate = "UPDATE test SET tsTest = CURRENT_TIMESTAMP WHERE pkID = %s;" valsUpdate = (1,) # 仅传递条件参数 mycursor.execute(sqlUpdate, valsUpdate)
为什么不能用参数传递?
参数化查询的设计是为了安全地传递用户输入/动态值,它会自动对传入的内容进行转义处理。当你把'CURRENT_TIMESTAMP'作为参数传入时,最终执行的SQL会变成:
INSERT INTO test (tsTest) VALUES ('CURRENT_TIMESTAMP');
MySQL会把带引号的CURRENT_TIMESTAMP当成字符串,而非内置函数,自然无法解析为合法的时间格式。
这种写法既保证了使用数据库服务器的时间(避免Python与数据库服务器时区/时间不一致的问题),同时也符合安全规范。
内容的提问来源于stack exchange,提问作者MaybeWeAreAllRobots
相关产品推荐
相关产品推荐

