Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL IF语句中的语法错误_Python_Sql_Postgresql_Flask - Fatal编程技术网

Python SQL IF语句中的语法错误

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() >

我正在使用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()
    >     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
$$