SQLAlchemy使用ORM创建视图。

21

我创建了以下ORM:

from sqlalchemy import Column, Integer, String, UniqueConstraint
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()


class TableA(Base):
    __tablename__ = 'table_a'

    id = Column(Integer, primary_key=True, nullable=False)
    identifier = Column(String(320))
    internal_id = Column(Integer)
    type = Column(String(32))
    time = Column(DateTime(timezone=True))
    success = Column(Boolean())
    parameters = Column(JSONB())



class TableB(Base):
    __tablename__ = 'table_b'
    __table_args__ = (UniqueConstraint('generate_action',
                                       'print_action',
                                        name='my_action_key'),)

    id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
    generate_action = Column(Integer)
    print_action = Column(Integer)
    generate_action = Column(Integer)
    coupon_code = Column(String(300))
    number_of_rebought_items = Column(Integer)
    seconds_between_rebuy = Column(Integer)

我正在尝试弄清楚如何将以下原始SQL view 转换为使用sqlalchemy的ORM语法。

CREATE VIEW my_view AS
    SELECT table_b.id as table_b_id,
        tb.coupon_code as coupon_code,
        tb.number_of_rebought_items as number_of_rebought_items,
        ta.id as table_a_action_id,
        ta.time as time,
        ta.parameters as parameters,
    FROM table_b tb
    LEFT JOIN table_a ta on
        ta.id = tb.generate_action;  

在ORM方面,我找不到任何好的例子。
目前,我唯一的解决方法是运行原始SQL以创建此视图。

有人可以指引我正确的方向,或者给出一个使用SQLAlchemy ORM创建视图的例子吗?

是否可以使用metadata.create_all()创建这些视图?


3
可能是 如何使用SQLAlchemy创建SQL视图? 的重复内容。 - univerio
5
不,那个问题和回答侧重于使用SQLAlchemy的Table类,而这个问题侧重于使用declarative_base设置的数据模型。 - Elaine Hale
5
例如,问题中声明的所有表格都可以使用一行代码创建:Base.metadata.create_all(engine)。是否有类似的方式声明选择语句作为视图,并使用create_all调用或类似的方法实例化它们? - Elaine Hale
1个回答

15

现在,库 sqlalchemy-utils 包含创建视图的功能,并将视图与 sqlalchemy 的 metadata 关联,因此可以使用 Base.metadata.create_all 创建视图。

示例:

# installation: pip install sqlalchemy-utils
from sqlalchemy_utils import create_view
from sqlalchemy import select, func

# engine Base & Table declaration elided for brevity

stmt = select([
    TableB.id.label('table_b_id'),
    TableB.coupon_code,
    TableB.number_of_rebought_items,
    TableA.id.label('table_a_action_id'),
    TableA.time,
    TableA.parameters
]).select_from(TableB.__table__.outerjoin(TableA, TableB.generate_action == TableA.id))

# attaches the view to the metadata using the select statement
view = create_view('my_view', stmt, Base.metadata)

# provides an ORM interface to the view
class MyView(Base):
    __table__ = view

# will create all tables & views defined with ``create_view``
Base.metadata.create_all()

# At this point running the following yields 0, as expected,
# indicating that the view has been constructed on the server 
engine.execute(select([func.count('*')], from_obj=MyView)).scalar() 

2
我无法使用alembic的autogenerate使其工作。 - Jorge Leitao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接