2016-05-24 4 views
0

Возможно ли использовать псевдонимы (My) SQL или атрибуты объекта SQLAlchemy либо в схеме таблицы, либо в определении класса модели?Имена псевдонимов псевдонимов в модели SQLAlchemy или базовой таблице SQL

Например, учитывая следующую таблицу:

Users 
--------------------- 
username | ... 

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

Users 
--------------------- 
id | username | ... 

Где user.id карты для user.username без дублирования этих данных.

Внедрение этого в схему таблицы было бы идеальным, но решения с ORM было бы достаточно.

class User(): 
    __tablename__ = 'Users' 
    username = Column(STRING, primary_key=True, alias='id') 

Для деталей

Мой случай использования является то, что я храню Царапины данные из различных веб-сайтов. Я индексирую эти данные с лучшим идентификатором пользователя, который у меня есть, который может быть именем пользователя, числовым идентификатором или даже полным именем.

Однако, чтобы нормализовать операции по таблицам, я бы хотел, чтобы каждая таблица имела поле «id», сопоставленное с лучшим ID.

Конечно у меня есть два варианта:

  1. Переименование выбранного идентификатора в качестве «Users.id», проигравшую читаемость для аналитиков.
  2. Дублирование данных из выбранного идентификатора в «Users.id», что делает операции записи базы данных более сложными в дополнение к тратам пространства для хранения.
+1

Думаю, вам нужно привести пример того, что вы имеете в виду. Возможно, столбцы «псевдоним», но, вероятно, не так, как вы имели в виду. – univerio

+0

теперь понятно? Но действительно, меня совсем не интересуют имена полей псевдонимов внутри выбранного запроса, если это то, о чем вы говорили. – bsuire

ответ

1

Вот элегантное решение, описанное в SQLAlchemy Docs, который делает именно то, что вы хотите:

from sqlalchemy.orm import synonym 
class User(): 
    __tablename__ = 'Users' 
    username = Column(STRING, primary_key=True) 
    id = synonym('username') 

Он работает так же, как и ожидалось:

>>> john = session.query(User).filter_by(id='John Doe').first() 
>>> print([john.id, john.username]) 
['John Doe', 'John Doe'] 
>>> john.id is john.username 
True 

Кстати, в User класс должен быть подклассом SQLAlchemy declarative_base() класс:

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
class User(Base): 
    ... 

Для получения дополнительной информации перейдите по ссылке docs.

+0

безупречный! Я полагаю, что я не использовал правильные ключевые слова («зеркало» и «синоним», а не противоречивый «псевдоним». В противном случае я просто смотрел. Кроме того, я знаю о declarative_base, но спасибо за указание на это. – bsuire

+0

* В противном случае Я просто смотрел на гибридные атрибуты, которые кажутся, что они могут предложить взломанный способ добиться этого. – bsuire

Смежные вопросы