代码之家  ›  专栏  ›  技术社区  ›  Ryan

将SQL转换为在Flask中运行的带有Join的Sqlalchemy Select

  •  0
  • Ryan  · 技术社区  · 6 年前

    我到处寻找使用类似于我的语法的SQLAlechmy语句的例子,但似乎找不到任何,所以这里是我的问题。

    SELECT register.username, rating, reviews 
    FROM reviews 
    JOIN register ON reviews.user_id = register.id 
    JOIN books ON reviews.book_id = books.id
    

    我像so一样在SQLAlchemy语句中使用占位符,并希望继续使用此项目的语法。

    books = db.execute("SELECT * FROM books WHERE id = :id", {"id": book_id})
    

    我尝试了几次转换目标SQL语句,但似乎无法正确地使用占位符。这是最近一次失败的尝试。

    db.execute("SELECT register.username, rating, reviews FROM reviews JOIN register ON reviews.user_id = :register.id \
        JOIN books ON reviews.book_id = :books.id", {"register.id": register_id}, {"books.id": book_id})
    

    编辑:

    为了解决更简单的问题并扩大规模,我将查询更改为以下内容:

    db.execute("SELECT register.username, rating, reviews FROM reviews JOIN register ON reviews.user_id = :register.id", {"register.id": register_id}).fetchall()
    

    sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'register' [SQL: 'SELECT register.username, rating, reviews FROM reviews JOIN register ON reviews.user_id = %(register)s.id'] [parameters: [{'register.id': 7}]]
    

    它想绑住 register ,这是一张桌子。尝试可能的修复方法。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Ryan    6 年前

    关键外卖: 以这种方式使用占位符时,请远离点符号,如 "register.id": 在你的字典里。SQLAlchemy将尝试将参数绑定到点左侧的名称。

    reviews = db.execute("SELECT register.username, rating, reviews FROM reviews JOIN register ON reviews.user_id = register.id").fetchall()
    

    为了解决占位符的问题,下面绕过了上面提到的错误消息 ,但未能返回所需的结果,因为查询仅限于一个 id ;我需要所有匹配的用户ID。注意如何 "register.id" 成为 身份证件 . 这是决定性的变化。

    reviews = db.execute("SELECT register.username, rating, reviews FROM reviews JOIN register ON reviews.user_id = :id", {"id": register_id}).fetchall()
    
        2
  •  0
  •   yogi    6 年前

    db.execute("SELECT register.username, rating, reviews FROM reviews 
    JOIN register ON reviews.user_id = register.id 
    JOIN books ON reviews.book_id = books.id 
    WHERE register.id = :rid AND books.id = :bid", 
    {"rid": register_id, "bid": book_id})