псевдоним sqlalchemy для имени столбца, также сохраняя оригинал - PullRequest
1 голос
/ 31 марта 2019

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

class A():
    __tablename__ = 'a'
    a_id = Column('a_id', INTEGER)

class B():
    __tablename__ = 'b'
    b_id = Column('b_id', INTEGER)

Таблицы имеют одинаковую схему, за исключением разницы в столбцах <tablename>_id, и это общий случай, когда мне нужно запросить оба вместе.
По прежним причинам я не могу переименовать свойство класса в id, но могу добавить свойство. Я ищу что-то вроде

class A():
    __tablename__ = 'a'
    a_id = Column('a_id', INTEGER)
    id = alias_of_column(a_id)

Есть что-нибудь подобное?

1 Ответ

1 голос
/ 31 марта 2019

sqlalchemy.orm.synonym - самый простой способ отразить столбец на другом атрибуте.

Из документов:

В самом простом смыслесиноним - это простой способ сделать определенный атрибут доступным с помощью дополнительного имени ...

И:

Синоним () можно использовать для любого типаатрибут сопоставления, который подклассов MapperProperty, включая сопоставленные столбцы и отношения, а также сами синонимы.

Использование так же просто, как пример в вашем вопросе:

from sqlalchemy.orm import synonym
class B(Base):
    __tablename__ = 'b'
    b_id = Column('b_id', INTEGER, primary_key=True)
    id = synonym('b_id')

Этот тестовый код:

s.add(B(id=1))
s.commit()
print(s.query(B).filter(B.id==1).one())

... испустил этот sql:

2019-03-31 20:54:05,208 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-03-31 20:54:05,209 INFO sqlalchemy.engine.base.Engine INSERT INTO b (b_id) VALUES (%(b_id)s)
2019-03-31 20:54:05,209 INFO sqlalchemy.engine.base.Engine {'b_id': 1}
2019-03-31 20:54:05,211 INFO sqlalchemy.engine.base.Engine COMMIT
2019-03-31 20:54:05,218 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-03-31 20:54:05,219 INFO sqlalchemy.engine.base.Engine SELECT b.b_id AS b_b_id
FROM b
WHERE b.b_id = %(b_id_1)s
2019-03-31 20:54:05,219 INFO sqlalchemy.engine.base.Engine {'b_id_1': 1}
B(b_id=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...