Python 将SQL转换为Sqlalchemy Select和在Flask中运行的联接

Python 将SQL转换为Sqlalchemy Select和在Flask中运行的联接,python,flask,sqlalchemy,flask-sqlalchemy,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语句中使用了占位符,比如so,并希望继续使用此项目的语法 b

我到处寻找使用类似于我的语法的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语句中使用了占位符,比如so,并希望继续使用此项目的语法

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

它想绑定到
寄存器
,这是一个表。尝试可能的修复方法

尝试在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})

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

虽然之前的查询都涉及占位符,未来的查询无疑也会涉及占位符,但获胜的查询不需要占位符(见下文)。这是SQLNoob的错误(慈善地说)

为了解决占位符问题,以下内容绕过了上述编辑中提到的错误消息,但未能返回所需的结果,因为查询仅限于一个
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()

你有什么错误吗?我可以看到“books.id”的占位符拼错为“book.id”。另外,您是否将占位符置于联接条件中?这很奇怪。我只在Where子句中见过它们。我所做的实际上并不需要Where子句。请注意,下面的SQL语句生成了所需的结果:选择register.username、rating、reviews FROM reviews JOIN register ON reviews.user\u id=register.id JOIN books ON reviews.book\u id=books.id这是一个非常有吸引力的查询,具有直观的吸引力。不幸的是,我收到错误“sqlalchemy.exc.NoInspectionAvailable:类型的对象没有可用的检查系统”。谢谢,正如您所建议的,正确命名占位符应该可以解决此问题。此外,我对语法进行了更改,此查询现在应该可以正常工作,不会出现错误。
reviews = db.execute("SELECT register.username, rating, reviews FROM reviews JOIN register ON reviews.user_id = :id", {"id": register_id}).fetchall()