Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2009 21:45:10

kawaikunee
От:
Зарегистрирован: 2009-05-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как построить orm с каскадным удалением?

Прошу помощи.
Создаю таблицу для иерархического построения разделов сайта. К примеру вот такую:

sections=Table('sections',meta,
—-Column('id',Integer,primary_key=True,autoincrement=True,nullable=False),
—-Column('parent_id',Integer, ForeignKey('sections.id'),nullable=False, default=0),
—-Column('name',String(255),default=u'',nullable=False)

class Sections(object):
—-def __repr__(self):
——–return self.name

Теперь создаю orm для таблицы, имеющей внешний ключ сама на себя:

orm.mapper(
—-Sections,sections,
—-properties={'parent':orm.relation(Sections,backref='childrens',remote_side=)}
)

Внимание вопрос! Что нужно изменить, чтобы удаляя запись из таблицы, удалялись все ее “детки” по внешнему ключу. Пробовал просто дописывать в mapper cascade='delete', и он даже работает, вот только задом наперед: удаляет родительскую запись, а не детские.



Офлайн

#2 Окт. 13, 2009 05:26:15

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как построить orm с каскадным удалением?

А так?

properties = {
'parent': orm.relation(Sections,
remote_side = [sections.c.id],
backref = orm.backref('childrens',
cascade = 'delete'))}
Хотя я делаю по другому, слежу за целостностью силами РСУБД:
...
categories = {
'dependency': ['sources', 'sessions'],
'columns': [
('id', {'type': db.types.Integer, 'primary_key': True}),
('src_id', {'type': db.types.Integer, 'primary_key': True}),
('cat_id', {'type': db.types.Integer, 'nullable': True}),
('name', {'type': db.types.String(150), 'nullable': False}),
('desc', {'type': db.types.Text})],
'constraints': [
db.ForeignKey('src_id', 'sources.id', ondelete = 'CASCADE'),
db.ForeignKey(['src_id', 'cat_id'], ['src_id', 'id'], ondelete = 'CASCADE')]
}
...
def_Category = {
'class': Category,
'table': categories,
'dependency': ['Source', 'Product'],
'properties': {
...
'categories': db.model_relation('Category',
cascade = 'all, delete',
lazy = 'dynamic',
passive_deletes = True,
backref = db.orm.backref('parent',
uselist = False,
remote_side = [categories.c.id])),
...
Это записи из моей базы, формат несколько отличается от “традиционного” SQLAlchemy, но это SQLAlchemy (кстати, было бы не лишним в следующий раз указывать в заголовке, или хотя бы в тексте, о каком собственно ORM речь, телепаты будут вам благодарны).
Внимание нужно обратить на constraints в объявлении отношения и на passive_deletes в маппере.

..bw



Отредактировано (Окт. 13, 2009 05:27:26)

Офлайн

#3 Окт. 13, 2009 08:35:19

kawaikunee
От:
Зарегистрирован: 2009-05-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как построить orm с каскадным удалением?

Весьма благодарю! Действительно, все стало корректно работать. Я неправильно оформлял маппинг, как и предполагал. Очень хорошо теперь!
Сначала тему запостил в разделе Pylons, а там алхимия по умолчанию. Потом добрый админ перенес ее сюда. Но, конечно, надо было указать все равно.
Уряяяяя!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version