SQLModel: sqlalchemy.exc.ArgumentError: Column expression or FROM clause expected,

SQLModel: sqlalchemy.exc.ArgumentError: Column expression or FROM clause expected,

我正在使用 SQLModel 库来做一个简单的 select(),就像他们官方网站上描述的那样。但是我收到 Column expression or FROM clause expected 错误消息

from typing import Optional

from sqlmodel import Field, Session, SQLModel, create_engine, select

from models import Hero
    
sqrl = f"mysql+pymysql:///roo@asdf:localhost:3306/datab"

engine = create_engine(sqrl, echo=True)


def create_db_and_tables():
    SQLModel.metadata.create_all(engine)


def select_heroes():
    with Session(engine) as session:
        statement = select(Hero)
        results = session.exec(statement)
        for hero in results:
            print(hero)


def main():
    select_heroes()


if __name__ == "__main__":
    main()

这是我的 models/Hero.py 代码:

from datetime import datetime, date, time
from typing import Optional
from sqlmodel import Field, SQLModel

class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None
    created: datetime
    lastseen: time
     

当我 运行 app.py 收到 sqlalchemy.exc.ArgumentError: Column expression or FROM clause expected, got <module 'models.Hero' from '/Users/dev/test/models/Hero.py'>. 消息时

错误信息<Column expression or FROM clause expected, got module 'models.Hero' from '/Users/dev/test/models/Hero.py'>告诉我们:

  • SQLModel / SQLAlchemy 意外收到名为 models.Hero
  • 的模块对象
  • 您有一个名为 Hero.py
  • 的模块

导入语句 from models import Hero 仅导入 模块 Hero。要么

  • 更改导入以导入模型*
    from models.Hero import Hero
    
  • 更改 select_heroes 中的代码以引用模型
    statement = select(Hero.Hero)
    

* 模块名称为 conventional to use all lowercase;遵循此约定将帮助您区分模块和模型。

† 我认为这种方法更可取:通过模块命名空间访问对象消除了名称冲突的可能性(当然它可以与小写模块名称结合使用)。