Python SQL IF语句中的语法错误
我正在使用python Flask,无法理解为什么会出现错误:Python SQL IF语句中的语法错误,python,sql,postgresql,flask,Python,Sql,Postgresql,Flask,我正在使用python Flask,无法理解为什么会出现错误: ProgrammingError: syntax error at or near "IF" LINE 1: IF SELECT count(*) FROM ProfilePicture WHERE userid = 这是我的密码: > def updateProfilePicture(filename, image, userid): > cursor = getCursor() >
ProgrammingError: syntax error at or near "IF"
LINE 1: IF SELECT count(*) FROM ProfilePicture WHERE userid =
这是我的密码:
> def updateProfilePicture(filename, image, userid):
> cursor = getCursor()
> binary = psycopg2.Binary(image)
> data = (userid, filename, binary, userid, filename, binary, userid)
> #SQL = """INSERT INTO ProfilePicture(id, image, userid)
> # VALUES (%s, %s, %s)"""
> SQL = """IF SELECT count(*) FROM ProfilePicture WHERE userid = %s > 0
> THEN
> UPDATE ProfilePicture SET id = %s, image = %s WHERE userid = %s
> ELSE
> INSERT INTO ProfilePicture(id, image, userid) VALUES (%s, %s, %s)
> END IF"""
> print cursor.mogrify(SQL, data)
> cursor.execute(SQL, data)
> cursor.connection.commit()
> cursor.close()
> return
一个简单的insert可以很好地工作,但if语句不行
谢谢你的帮助 由于PostgreSQL 9.5中引入了“ON CONFLICT”语法,因此必须在python中测试行的存在性
如果用户ID上有唯一约束,则可以使用异常:
def updateProfilePicture(filename, image, userid):
cursor = getCursor()
binary = psycopg2.Binary(image)
data = (userid, filename, binary, userid, filename, binary, userid)
SQL = """INSERT INTO ProfilePicture(id, image, userid) VALUES (%s, %s, %s)"""
try:
cursor.execute(SQL, data)
except:
cursor.rollback()
SQL = """UPDATE ProfilePicture SET id = %s, image = %s WHERE userid = %s"""
cursor.execute(SQL, data)
cursor.connection.commit()
cursor.close()
这不是SQL语法,而是过程语言。它主要用于写作。您可以将其用于一次性命令,但需要将其置于:
但是,请注意,如果其他人同时在
ProfilePicture
中插入/删除,则您的逻辑将不起作用;您可能会丢失更新,或为同一用户ID插入多条记录。避免这种情况是不可能的。我认为PostgreSQL中没有任何这样的语法,它看起来可能是相关的/适用的。如果存在,最好使用(选择*从…)
我确信这就是您想要的:
DO $$
BEGIN
IF (SELECT count(*) FROM ProfilePicture WHERE userid = %s) > 0 THEN
UPDATE ProfilePicture SET id = %s, image = %s WHERE userid = %s;
ELSE
INSERT INTO ProfilePicture(id, image, userid) VALUES (%s, %s, %s);
END IF;
END
$$