对于使用类似于我的语法的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
(这是一个表)上。试用可能的修复程序。
答案 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()