Найти - Пользователи
Полная версия: Как построить orm с каскадным удалением?
Начало » Базы данных » Как построить orm с каскадным удалением?
1
kawaikunee
Прошу помощи.
Создаю таблицу для иерархического построения разделов сайта. К примеру вот такую:

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', и он даже работает, вот только задом наперед: удаляет родительскую запись, а не детские.
bw
А так?
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
kawaikunee
Весьма благодарю! Действительно, все стало корректно работать. Я неправильно оформлял маппинг, как и предполагал. Очень хорошо теперь!
Сначала тему запостил в разделе Pylons, а там алхимия по умолчанию. Потом добрый админ перенес ее сюда. Но, конечно, надо было указать все равно.
Уряяяяя!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB