使用子查询和Python插入数据

时间:2018-07-10 15:09:01

标签: python postgresql

我对整个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”和“体裁”是变量

我已经独立(在插入内容之外)测试了查询,并且它们返回了预期的结果

有人能给它带来一些神圣的启示吗?谢谢

1 个答案:

答案 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都有一个值。强烈建议在每个查询中使用""",部分原因是为了提高可读性,部分原因是它可以防止您不得不转义"'字符。