SQLAlchemy ORM Вставка связанных объектов без их выбора - PullRequest
2 голосов
/ 02 февраля 2010

В учебном пособии по SQLAlchemy он описывает процесс создания объектных отношений примерно следующим образом. Давайте представим, что у меня есть таблица Articles, таблица Keywords и таблица Articles_Keywords, которые создают отношение многие-многие.

article = meta.Session.query(Article).filter(id=1).one()
keyword1 = meta.Session.query(Keyword).filter(id=1).one()
keyword2 = meta.Session.query(Keyword).filter(id=2).one()
article.keywords = [keyword1,keyword2]
meta.Session.commit()

У меня уже есть идентификаторы первичного ключа для рассматриваемых ключевых слов, поэтому все, что мне нужно сделать, это добавить эти идентификаторы в таблицу Articles_Keywords, связанную с этой статьей. Проблема в том, что для того, чтобы сделать это с ORM, мне нужно выбрать все ключевые слова из базы данных, что добавляет много накладных расходов, казалось бы, без причины.

Есть ли способ создать эту связь без запуска SQL для выбора ключевых слов?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

К сожалению, ORM не может поддерживать состояние объекта в нормальном состоянии без запроса базы данных. Однако вы можете легко обойти ORM и вставить в таблицу ассоциаций. Предполагая, что Articles_Keywords является Table объектом:

 meta.Session.execute(Articles_Keywords.delete(Articles_Keywords.c.article_id == 1))
 meta.Session.execute(Articles_Keywords.insert(), [
     {'article_id': 1, 'keyword_id': 1},
     {'article_id': 1, 'keyword_id': 2},
 ])

Если вы обойдете ORM, то уже загруженные коллекции не будут обновлены, чтобы отразить изменения в базе данных. Если вам нужно обновить коллекцию, вызовите Session.expire. Это приведет к перезагрузке коллекции при следующем обращении к ней.

meta.Session.expire(article, ['keywords'])
1 голос
/ 05 февраля 2010

Ants имеет правильный ответ, но также если вы явно отобразили article_keywords как объект ассоциации, вы просто создадите новые объекты ArticleKeyword и добавите их прямо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...