2012-06-28 7 views
1

У меня есть много типов авторизаций, поэтому у меня есть одна база Postgres таблицы (так называемый «» аутентификации), а также другие типы авторизаций являются производными от него. Например, объект, который получает аутентификацию с использованием пароля, называется «password_authentications» и он наследует от таблицы «« Аутентификации », используя postgres. Схема такова:Postgres наследование с SQLAlchemy: SQLAlchemy Отношения

CREATE TABLE authentications (
id 
) 

CREATE TABLE password_authentications (
id 
password 
) inherits (authentications) 

Это очень элегантный, потому что у меня есть таблица под названием «Пользователи», который имеет ForeignKey в авторизаций таблице:

CREATE TABLE users (
id 
username 
authentications_id 
) 

Следовательно, пользователь может быть удостоверен все, что наследуется от аутентификации. Поэтому в будущем, если нам нужно аутентифицировать пользователей, использующих RSA (например), все, что я сделал бы, это сделать базовый класс из аутентификаций, которые описывали аутентификацию RSA.

Теперь я хочу использовать SQLAlchemy для построения сопоставления между классами Python и этой структурой. В частности, я хочу отобразить класс под названием «Пользователь» в таблицу «пользователей» (это легко сделать), но я хочу установить связь с паролем-аутентификацией (а не при аутентификации). На самом деле, я хочу динамически строить эти отношения, поэтому, если один пользователь аутентифицируется с использованием пароля, SQLAlchemy свяжет таблицу «Пользователи» с таблицей «Пароль_Аутентификация». Если существует еще один тип аутентификации, вместо этого пользователь должен быть привязан к этой таблице. Единственное, что все таблицы, с которыми Пользователь связывается, чтобы иметь общее, состоит в том, что они получены из таблицы Аутентификация. Следовательно, таблица «Пользователи» имеет в этой таблице дополнительный ключ.

Как я могу выполнить вышеуказанное? Возможно ли это?

ответ

3

SA не поддерживает INHERITS от postgresql с точки зрения наследования объекта модели. Однако, пожалуйста, взгляните на рецепт PostgreSQLInheritance, где Mike показывает, как использовать эти два вместе и их ограничения.

Также смотрите ответ на Python, SQLAlchemy and Postgresql: understanding inheritance, где TokenMacGuy объясняет разницу между Inheritance in terms of OOP и postgresql table inheritance.


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

+0

Но в каждой таблице postgres есть столбельная колонка, которая может очень легко использоваться в качестве дискриминатора для конкретного наследования. Поэтому я не могу понять, почему это не сработает! –

+0

Почему я не могу использовать конкретное наследование таблицы с tableoid как дискриминатор ??? –

+1

Я считаю, что вы можете заставить его работать, но это было бы не так хорошо и портативно, как вы могли бы подумать: 1) у вас нет контроля над 'tableoid's; 2) они являются числовыми и не читаются *; 3) также вам придется жестко закодировать свои значения в своей модели Python для каждого значения «polymorphic_identity»; 4) как только вы перейдете от 'test' к' production', 'tableoid' может быть другим, поэтому вам придется изменить свою кодовую базу, чтобы она работала ... Я уверен, что есть другие оговорки, о котором я даже не могу думать, поскольку я не использую 'postresql'. – van

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