如何在psycopg2的SQL查询中正确传入datetime类型参数?
正确用Python datetime筛选PostgreSQL rental表数据
你之前的错误是把Python的datetime.datetime()直接硬写到SQL语句里了,PostgreSQL根本不认识这个语法,会把datetime当成数据库里的schema,所以才报"schema 'datetime' does not exist"。
psycopg2本身支持自动转换Python的datetime类型到PostgreSQL的timestamp类型,正确做法是用参数绑定,既安全还能自动处理类型转换,代码如下:
import psycopg2 as pg from datetime import datetime # 建立数据库连接 conn = pg.connect(host='localhost', port='5432', dbname='dvdrental', user='postgres', password='123') cur = conn.cursor() # 定义要筛选的目标时间 target_rental_date = datetime(2005, 5, 24, 22, 54, 33) # 使用%s作为参数占位符,把datetime值通过元组传递给execute方法 cur.execute("SELECT * FROM rental WHERE rental_date = %s", (target_rental_date,)) # 获取并处理查询结果 results = cur.fetchall() for record in results: print(record) # 记得关闭游标和连接 cur.close() conn.close()
关键注意点:
- 用
%s作为psycopg2的参数占位符(这不是Python的字符串格式化符号,是psycopg2专门的语法) - 参数必须以元组形式传入,哪怕只有一个参数,也要加逗号写成
(target_rental_date,),不然会被当成单个值而非可迭代对象 - 不需要手动把datetime转成字符串格式,psycopg2会自动完成Python datetime到PostgreSQL timestamp的类型映射
- 这种参数绑定方式能避免SQL注入,比直接拼接SQL字符串安全得多
内容的提问来源于stack exchange,提问作者Waster
相关产品推荐
相关产品推荐

