使用在Flask中运行的Join将SQL转换为Sqlalchemy Select

时间:2018-08-13 00:08:34

标签: python flask sqlalchemy flask-sqlalchemy

对于使用类似于我的语法的SQLAlechmy语句的示例,我一直走高求低,但似乎找不到任何答案,因此这是我的问题。

我在数据库中运行的语句是:

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

我像这样在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 个答案:

答案 0 :(得分:0)

尝试在WHERE子句中而不是在JOIN条件下使用占位符。

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

答案 1 :(得分:0)

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

尽管先前的查询都包含占位符,而将来的查询无疑会做同样的事情,但是获胜的查询不需要任何占位符(请参见下文)。这是SQL noob的错误(慈善地说)。

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

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

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