Python向PostgreSQL插入含SELECT语句的元组时语法错误求助
解决Python封装PostgreSQL插入函数时的子查询语法错误
你遇到的语法错误根源很明确:调用insrtDirector函数时,直接把SQL子查询(SELECT "UName" from ...)作为参数传入,这相当于把SQL语法当成Python代码执行,Python解析器无法识别SELECT关键字,因此报错。
下面提供两种可行的解决方式:
方式一:将子查询整合到INSERT语句中(推荐)
把SELECT子查询直接写入INSERT的SQL模板里,只将静态值作为参数传递,让数据库层面执行子查询逻辑,这样只需要一次数据库交互,效率更高。
修改后的代码:
def insrtDirector(q, r, t, y, u): # 将子查询嵌入INSERT语句,参数仅传递需要匹配的静态值 insrt = """ INSERT INTO "Director" VALUES ( %s, (SELECT "UName" from University WHERE "UName" = %s), (SELECT "DName" from Department WHERE "DName" = %s), %s, %s, %s, %s ) """ sql_params = (q, 'University College London', 'English', r, t, y, u) cur.execute(insrt, sql_params) # 调用函数时仅传入静态参数 insrtDirector( uuid.uuid4(), 'Christopher (3)', 'Nolan (3)', 1970, 'Westminster, London, United Kingdom' )
方式二:先执行子查询获取结果,再传入函数
如果需要在Python端对子查询结果做额外处理,可以先单独执行SELECT语句拿到值,再将结果作为参数传入插入函数。
修改后的代码:
# 提前查询大学名称 cur.execute("SELECT \"UName\" from University WHERE \"UName\" = %s", ('University College London',)) uname = cur.fetchone()[0] # 提前查询院系名称 cur.execute("SELECT \"DName\" from Department WHERE \"DName\" = %s", ('English',)) dname = cur.fetchone()[0] def insrtDirector(q,w,e,r,t,y,u): insrt = """INSERT INTO \"Director\" VALUES (%s,%s,%s,%s,%s,%s,%s)""" cur.execute(insrt, (q,w,e,r,t,y,u)) # 调用函数时传入查询得到的结果 insrtDirector( uuid.uuid4(), uname, dname, 'Christopher (3)', 'Nolan (3)', 1970, 'Westminster, London, United Kingdom' )
内容的提问来源于stack exchange,提问作者V K
相关产品推荐
相关产品推荐

