使用Python Scrapy框架向PostgreSQL插入日期失败求助
解决psycopg2.DataError: invalid input syntax for type timestamp with time zone问题
这个问题我之前也碰到过,原因很明确:PostgreSQL的timestamp with time zone类型要求的是完整的日期时间格式(比如2024-05-20 16:40:30),但你现在只传了时分秒(16:40:30),数据库没法把这个字符串解析成带时区的时间戳,所以抛出了DataError。
这里有两种可靠的解决方法:
方法1:直接传递Python datetime对象(推荐)
psycopg2原生支持Python的datetime类型,不需要手动转成字符串,它会自动帮你处理类型转换,既避免格式错误,又更高效。修改后的代码如下:
from datetime import datetime # 你的Scrapy pipeline代码片段 if spider.name == 'indianexpress': self.cur.execute( "insert into feed_indianexpress(headline,link,date) values(%s,%s,%s)", (item['headline'], item['link'], datetime.now()) ) self.connection.commit()
方法2:生成完整的日期时间字符串
如果你坚持要手动格式化字符串,需要包含日期+时间的完整格式,比如%Y-%m-%d %H:%M:%S,这样PostgreSQL才能正确解析:
from datetime import datetime # 你的Scrapy pipeline代码片段 if spider.name == 'indianexpress': self.cur.execute( "insert into feed_indianexpress(headline,link,date) values(%s,%s,%s)", (item['headline'], item['link'], datetime.now().strftime("%Y-%m-%d %H:%M:%S")) ) self.connection.commit()
额外提示
如果你的date字段实际上只需要存储时间(不需要日期),那可以考虑把PostgreSQL字段类型改成time,这样传%H:%M:%S格式的字符串就没问题了,但从字段名date来看,应该还是存储完整时间戳更合理。
内容的提问来源于stack exchange,提问作者Nadeem Khan
相关产品推荐
相关产品推荐

