gpt4 book ai didi

python - SQLAlchemy ORM 自动加载关系

转载 作者:行者123 更新时间:2023-12-04 15:10:22 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com