Модель отношений Flask множественная получить или создать, если не существует - PullRequest
1 голос
/ 26 февраля 2012

Я только что начал с Flask и SQLAlchemy в flask.

Так что у меня есть отношение многие ко многим, используя приведенный здесь пример http://docs.sqlalchemy.org/en/latest/orm/tutorial.html Если вы прокрутите к части о ключевых словах и тегахэто то, над чем я работаю.Пока я могу вставить новые ключевые слова, связанные с моим сообщением, и я использую приложение.Что не так, я знаю.Так что в следующий раз, когда в сообщении блога появится неуникальное ключевое слово, возникнет ошибка о конфликте с ключевым словом (поскольку ключевые слова должны быть уникальными)

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

Редактировать: найдено решение, документы SQLAlchemy приведут вас к ошибке, но объяснение здесь.Я добавил ответ.

1 Ответ

2 голосов
/ 27 февраля 2012

Хорошо, после нескольких часов проб и ошибок я нашел решение, плюс кое-что, что я делал не так.

Так работает SQL-алхимия. ответ - слияние.

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

tags = [Tag('a1'),Tag('a2')]

Скажем, у вас есть тег a1 уже в БД, но нам все равно. Все, что мы хотим, это вставить, если связанных данных не существует. Что делает SQLalchemy? Теперь вы делаете сообщение со списком всех тегов, которые мы сделали. Если это только один, это также список.

1010 * поэтому *

new_post = Post('a great new post',post_tags=tags)
db.session.merge(new_post)
db.session.commit()

Я использовал синтаксис Flask, но идея та же. Просто убедитесь, что вы не создаете модель вне сеанса. Скорее всего, вы этого не сделаете.

Это было на самом деле просто, но нигде в документации по SQLAlchemy этот пример не упоминается. Они используют append (), что неправильно. Это только для создания новых тегов, зная, что вы не делаете дубликаты.

Надеюсь, это поможет.

...