本机 mySQL SQL Select 与 SQLAlchemy

Native mySQL SQL Select with SQLAlchemy

我有一个 class“面板”,直到现在我一直在使用它,暂时并继续前进,通过一个简单的查询,我只是从中选择了第一个值:

result = self.database.session.query(Panel)
panel : Panel = result.first() #Loads and bind firs panel object.

在这一点上,我确实需要从数据库中正确地select取值。 SQL 语言 select 中的 select 正确并且按照我需要的面板元素的顺序。我知道原生 select 可以直接通过 SQLAlchemy 发送,这是我用于列值的东西,但现在我需要将“面板”对象附加到会话并自动加载:

query = f"SELECT PANEL.* FROM PANEL LEFT JOIN PANEL_BOT_DONE ON PANEL.PANE_ID = PANEL_BOT_DONE.PANE_ID AND PANEL_BOT_DONE.BOT_ID = {self.id} ORDER BY PANE_BOT_USES ASC, PANE_GOODSCORE DESC"
result = self.database.executeQuery(query)
panel = result.first() #This line returns tuples. Any way to load automatically the panel value?

有没有一种方法可以使用此 select 自动加载 Panel 对象,该对象具有您 table 中的所有字段(并且只有字段),而无需逐列加载,然后绑定到会话?

谢谢

我不确定我是否误解了你的问题,或者你是否对 ORM 感到困惑,或者两者都有一点。您可以使用 orm 在后台生成 SQL 查询以获得任意结果并将它们自动填充到对象中。我无法完全理解您的 class 关系,所以我只是猜测并为 PanelBotDone 制作了另一个 class 并假设排序列位于

# This assumes self.database is an SQLAlchemy ORM session
# and will generate an SQL with a LEFT JOIN like you described.
# Use .outerjoin() for LEFT OUTER JOIN.
query = self.database.query(
    Panel
).join(
    PanelBotDone, 
    Panel.pane_id == PanelBotDone.pane_id
).filter(
    PanelBotDone.bot_id == self.id
).order_by(
    PanelBotDone.pane_bot_uses.asc(),
    PanelBotDone.pane_goodscore.desc())

# Just one panel
panel = query.first()
# OR all the panels
panels = query.all()