У меня нет полного понимания запроса , который вы пытаетесь выразить, если это объединение, объединение или какая-то третья вещь, но, кроме этого, это, безусловно, - это возможно отобразить произвольный выбор (все, что вы можете передать в базу данных, которая возвращает строки).
Я начну с предположения, что вы хотите какое-то объединение таблиц A и Table B, которое будет содержать все строки в A, а также все строки в B. Это достаточно легко изменить на другой Концепция, если вы раскрываете больше информации о форме данных, которые вы выражаете.
Начнем с настройки реальных таблиц и классов для их отображения в декларативном стиле.
from sqlalchemy import *
import sqlalchemy.ext.declarative
Base = sqlalchemy.ext.declarative.declarative_base()
class TableA(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
a_code = Column(String)
class TableB(Base):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
b_code = Column(String)
Так как мы использовали декларативный, у нас фактически нет экземпляров таблиц для работы, что необходимо для следующей части. Есть много способов доступа к таблицам, но я предпочитаю использовать методы самоанализа отображения с помощью sqlalchemy, так как это будет работать независимо от того, как был отображен класс.
from sqlalchemy.orm.attributes import manager_of_class
a_table = manager_of_class(TableA).mapper.mapped_table
b_table = manager_of_class(TableB).mapper.mapped_table
Далее нам нужно фактическое выражение sql, которое представляет интересующие нас данные.
Это объединение, в результате столбцы которого выглядят так же, как столбцы, определенные в первом классе, id
и a_code
. Мы могли бы переименовать его, но это не очень важная часть примера.
ab_view_sel = sqlalchemy.alias(a_table.select().union(b_table.select()))
Наконец, мы сопоставляем класс с этим. Для этого можно использовать декларативное, но на самом деле это больше кода, чем классический стиль отображения, а не меньше. Обратите внимание, что класс наследуется от object
, а не base
class ViewAB(object):
pass
sqlalchemy.orm.mapper(ViewAB, ab_view_sel)
И это во многом. Конечно, есть некоторые ограничения с этим; наиболее очевидно, что нет (тривиального) способа сохранить экземпляры ViewAB
обратно в базу данных.