Возможно добавить объект в сеанс SQLAlchemy без явного session.add ()? - PullRequest
4 голосов
/ 07 ноября 2010

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

m = Model("mysql://localhost/mydb")
s1 = Service("somename")
m.session.add(s1)
s1 is m.get_service("somename") # True

Это на самом деле более рационально, но работайте со мной здесь.

Можно ли пропустить шаг session.add ()? Другими словами, если я создаю экземпляр сопоставленного класса, возможно ли его автоматическое добавление в активный сеанс SQLAlchemy (если есть)?

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

В SQLAlchemy вы можете делать это только с таблицами, привязывая их метаданные к движку.Это не работает с частью ORM SQLALchemy.

http://www.sqlalchemy.org/docs/core/schema.html?highlight=metadata#binding-metadata-to-an-engine-or-connection

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

http://www.sqlalchemy.org/docs/orm/session.html?highlight=scoped%20session#sqlalchemy.orm.scoped_session

2 голосов
/ 13 ноября 2010

На самом деле, не всегда. Если вы определили отношения между дочерними и родительскими моделями или отношения «многие ко многим», вам нужно только явно добавить родительские объекты. Дочерние объекты добавляются автоматически при назначении атрибута parent, который всегда находится в db / session. Пример:

a1 = Author(name='Pynchon') # out of session
session.add(a1) # in session
b1 = Book(name='Gravity`s Rainbow') # out of session
b1.author = a1 #in session
a2 = session.query(Author).filter(name='Eco').one() # in session
b2 = Book(name='Baudolino') # out of session
b2.author = a2 # in session

Конечно, вам нужно заранее указать отношение автора к картографам.

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