Создайте вычисляемый столбец в основной таблице SQLAlchemy. - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть таблица SQLAlchemy, определенная следующим образом:

user = Table('user', MetaData(),
             Column('id', Integer),
             Column('first_name', String),
             Column('last_name', String))

Мне часто нужно указывать полное имя пользователя во время запроса, например:

sql = (select([
          user.c.id,
          (user.c.first_name + user.c.last_name).label('full_name')
       ]).where(user.c.id == 123))

Поскольку используется полное имяво многих местах такой код имеет много копий.

Интересно, есть ли способ в SQLAlchemy, я могу создать вычисляемый столбец, чтобы я мог удобно использовать его так же, как другие нормальные столбцы,SQLAlchemy автоматически преобразует его в (user.c.first_name + user.c.last_name).label('full_name') всякий раз, когда я ссылаюсь user.c.full_name

sql = (select([
          user.c.id,
          user.c.full_name
       ]).where(user.c.id == 123))

Я искал и нашел там какое-то решение в SQLAlchemy ORM, используя column_property или hybrid_property.Разница в моем случае заключается в том, что я могу использовать только SQLAlchemy Core .

1 Ответ

1 голос
/ 13 апреля 2019

Невозможно создать вычисляемые столбцы в ядре sqlalchemy.Однако делать это не нужно, все, что требуется, - это сохранить выражение в переменной, а затем использовать это в выражениях выбора.Если у вас есть много из них для хранения, вы можете разместить их в пространстве имен, сохранив их все в коллекции.В приведенном ниже примере для этой цели я использовал объект свойств SQLAlchemy, поэтому он будет вести себя аналогично коллекции столбцов.

class Table(sqlalchemy.Table):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.d = sqlalchemy.util._collections.Properties({})

user = Table('user', MetaData(),
             Column('id', Integer),
             Column('first_name', String),
             Column('last_name', String))
user.d.full_name = (user.c.first_name + user.c.last_name).label('full_name')
user.d.backwards_name = (user.c.last_name + user.c.first_name).label('backwards_name')

sql = (select([
          user.c.id,
          user.d.full_name
       ]).where(user.c.id == 123))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...