2009-05-07 4 views
0

Я столкнулся с местом в моем текущем проекте, где я создал несколько классов для хранения сложной структуры данных в памяти и завершенной схемы SQL для хранения тех же данных в база данных. Я решил использовать SQLAlchemy как уровень ORM, поскольку это кажется самым гибким решением, которое я могу приспособить к моим потребностям.Сопоставление таблицы базы данных с атрибутом объекта

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

В таблице вопрос создается при помощи следующей SQL:

CREATE TABLE `works` (
`id` BIGINT NOT NULL auto_increment, 
`uniform_title` VARCHAR(255) NOT NULL, 
`created_date` DATE NOT NULL, 
`context` TEXT, 
`distinguishing_characteristics` TEXT, 
PRIMARY KEY (`id`), 
INDEX (`uniform_title` ASC), 
INDEX (`uniform_title` DESC) 
) ENGINE = InnoDB DEFAULT CHARSET = utf8 ; 

CREATE TABLE `variant_work_titles` (
`id` BIGINT NOT NULL auto_increment, 
`work_id` BIGINT NOT NULL, 
`title` VARCHAR(255) NOT NULL, 
PRIMARY KEY(`id`), 
INDEX (`work_id`), 
INDEX (`title` ASC), 
INDEX (`title` DESC), 
FOREIGN KEY (`work_id`) 
    REFERENCES `works` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

Это лишь небольшая часть всей базы данных и то же самое будет необходимо в нескольких местах.

ответ

1

Кажется, что вы хотите что-то вроде

work_instance.variants = [<some iterable of variants>] 

Если нет, пожалуйста, уточнить в вашем вопросе.

В идеале у вас должно быть 2 сопоставления с этими двумя столами. Не имеет значения, если вы не будете получать доступ ко второму сопоставлению нигде. work картирование должно иметь отношение «один ко многим» к картине variant. Это даст вам список variant экземпляров, связанных с конкретным work, на каком атрибуте вы определяете свои отношения.

+0

Это похоже на то, что я хочу. Есть ли способ сделать это без необходимости иметь класс python для вариантов? Или я должен сдаваться и иметь класс для каждого из этих элементов, несмотря на их простоту? – workmad3

+0

Вам не нужен класс для ORM SQLAlchemy. Вы можете просто запросить таблицу без сопоставления ORM. Вы можете использовать явный fetchall(), чтобы получить все строки; вы получаете список словарей. –

+0

S.Lott прав, вам не обязательно иметь класс для каждой таблицы. Но я все равно их создавал. Где-то в вашем коде вы захотите работать с вариантами, и вам может показаться более практичным иметь сопоставление, чем прикрепить функциональность к сопоставлению работы. – muhuk

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