我对整个Python + DB交互有点陌生,在尝试使用子查询插入表时遇到了一些问题。在这一点上,我认为这只是语法/缺少括号/缺少感叹号/等的问题,但我似乎无法自己弄清楚,所以也许换个新的眼睛可以解决这个问题。
这是我要运行的查询:
self.cur.execute("INSERT INTO game_genre (id_game, id_genre) VALUES (( SELECT gd.id_game from game_details gd where gd.title like %s, ( "%" + x + "%" , )) , (SELECT g.id_genre from genres g where g.title_genre like %s, ("%" + genre + "%",))"))
其中“ x”和“体裁”是变量
我已经独立(在插入内容之外)测试了查询,并且它们返回了预期的结果
有人能给它带来一些神圣的启示吗?谢谢
答案 0 :(得分:0)
您似乎在尝试对查询进行参数化,但您将两个不同的参数列表作为postgres代码插入到查询中,而不是在查询后仅一个作为python代码。格式化代码始终是一个好主意,以使整个结构突兀。
尝试:
self.cur.execute("""
INSERT INTO game_genre (id_game, id_genre)
VALUES (
(SELECT gd.id_game FROM game_details gd WHERE gd.title LIKE %s),
(SELECT g.id_genre FROM genres g WHERE g.title_genre LIKE %s))
""", ("%" + x + "%", "%" + genre + "%"))
有关查询参数化的更多详细信息,请参见http://initd.org/psycopg/docs/usage.html。特别要注意的是,execute()
进行的查询包含一堆%s
,然后是一个参数列表,其中每个%s
都有一个值。强烈建议在每个查询中使用"""
,部分原因是为了提高可读性,部分原因是它可以防止您不得不转义"
和'
字符。