【发布时间】:2014-02-17 11:10:35
【问题描述】:
import psycopg2
#Given media_id and image_url and conn object
image_data = urllib2.urlopen(image_url).read()
sql =("INSERT INTO images (media_id, data)
SELECT %s
WHERE
NOT EXISTS (SELECT media_id FROM images WHERE media_is = CAST(%s as TEXT) ")
data_insert_image = (media_id, psycopg2.Binary(image_data))
cursor.execute(sql_insert_image, data_insert_image)
conn.commit()
结果是:
TypeError: not all arguments converted during string formatting
这对我来说很有意义,因为图像不是String;但是,我不知道如何正确插入。应该如何插入?
【问题讨论】:
-
您的查询中有两条 SQL 语句。我会把它们一分为二。插入语句应该可以正常使用
psycopg2.Binary -
@nathancahill 将其分成两个查询并不能解决图像插入上的类型错误
-
你在那里做了一个不正确的 upsert - 它在并发的情况下不起作用。我不清楚为什么 Psycopg2 不喜欢这个查询。
psycopg2.Binary(image_data)确实是处理bytea数据的正确方法。您的询问也是无稽之谈;INSERT接受(media_id, data)但您只在SELECT-list 中为media_id提供了一个参数。 -
请说明当您尝试进行简单插入时会发生什么(因为这是关于二进制处理);保持 upsert 的混乱以备后用。关于 upserts,请阅读stackoverflow.com/questions/17267417/…
标签: python sql postgresql psycopg2