SQLAlchemy ORM自动加载的关系

3 人关注

我已经从一个服务中制作了一个表(没有使用sqlalchemy),现在我想用sqlalchemy查询这些表

我使用的语法是这样的

from app import db, engine, Base
from sqlalchemy import Table, Column, String, Integer, TIMESTAMP, Float
class Post(Base):
    __table__ = Table('posts', Base.metadata,
                      autoload=True, autoload_with=engine)

这样做是有效的,我可以查询我的对象。

恼人的是,我无法在运行前获得这些属性,因为(很明显),在编译前没有任何东西。有什么办法可以在使用这样的东西时添加类型,还是我必须假设它们就在那里?

3 个评论
好吧,你可以根据你对表结构的了解,在你的类中硬编码适当的 Column 对象,但如果只是按照你现在的方式反映它们,然后只是 "假设【列】在那里",这有什么问题?
BTW, autoload=True is obsolete; just use autoload_with=engine
Dedi
@GordThompson 谢谢你的提示!我想这不是一个问题。不过,关系如何呢?
python
flask
sqlalchemy
flask-sqlalchemy
Dedi
Dedi
发布于 2020-12-14
1 个回答
Gord Thompson
Gord Thompson
发布于 2020-12-14
已采纳
0 人赞同

对于现有的表,我们可以反映表的特定信息(列、FK等),并且仍然可以添加我们自己的额外的ORM特定属性,如关系。

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
print(sa.__version__)  # 1.3.20
connection_uri = "mssql+pyodbc://@mssqlLocal64"
engine = sa.create_engine(connection_uri, echo=False)
# show existing sample data
with engine.connect() as conn:
    results = conn.execute(sa.text("SELECT * FROM users"))
    print([dict(r) for r in results])
    # [{'id': 1, 'name': 'Gord'}]
    results = conn.execute(sa.text("SELECT * FROM posts"))
    print([dict(r) for r in results])
    # [{'id': 1, 'user_id': 1, 'post': 'Hello world!'}]
Base = declarative_base()
meta = Base.metadata
class User(Base):
    __table__ = sa.Table("users", meta, autoload_with=engine)
class Post(Base):
    __table__ = sa.Table("posts", meta, autoload_with=engine)
    author = sa.orm.relationship("User")
    def __repr__(self):
        return f"<Post(id={self.id}, author_name='{self.author.name}', post='{self.post}')>"
Session = sessionmaker(bind=engine)