python - SQLAlchemy ORM 自动加载关系

标签 python flask sqlalchemy flask-sqlalchemy

我已经从一个服务(不使用 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)
    

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

令人烦恼的是,我无法在运行时之前获取属性,因为(显然)在编译之前没有任何内容。有没有办法在使用这样的东西时添加类型,或者我必须假设它们在那里?

最佳答案

对于现有的表,我们可以反射(reflect)特定于表的信息(列、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)
session = Session()

my_post = session.query(Post).get(1)
print(my_post)  # <Post(id=1, author_name='Gord', post='Hello world!')>

关于python - SQLAlchemy ORM 自动加载关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65288126/

相关文章:

python - 在多个程序之间共享 SQLite3 数据库

python - 如何使用 scipy 执行二维插值?

python - 与 Flask 应用程序同时运行 GUI

python - Alembic:包括约束以拒绝带有字符的字符串

Flask-cache memcache 连接自动重新连接

python - Jinja2 遍历字典项列表

python - sqlalchemy动态构建or_合取and_

Python包(报纸)安装错误

python - 如何用 Python 更新屏幕上的 N 行?

python - 预期交互式解析失败?