В SQLAlchemy, можно ли объявлять каскадные отношения при использовании декларативного стиля? - PullRequest
0 голосов
/ 01 марта 2010

В SQLAlchemy мы можем объявить таблицы и их отношения следующим образом:

user = Table(
    'users', metadata,
    Column('id', Integer, primary_key=True))

address = Table(
    'adresses', metadata,
    Column('id', Integer, primary_key=True),
    Column('user_id', Integer, ForeignKey('user.id')))

class User(object): pass

class Address(object): pass

session.mapper(User, user, properties=dict(
    'address' = relation(Address, backref='user', cascade="all")))

(Обратите внимание на каскад в строке выше.)

Однако мы также можем использовать альтернативный сокращенный стиль , называемый декларативный стиль , в котором мы можем выразить одно и то же в меньшем количестве строк кода, исключив отношения mapper () :

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)

class Adress(Base):
    __tablename__ = 'adresses'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('user.id')))

Но если мы используем этот декларативный стиль, есть ли альтернативный способ определения каскадных отношений?

1 Ответ

5 голосов
/ 03 марта 2010

На самом деле использование «декларативного» не означает, что вы опускаете отношения. Вы по-прежнему указываете их, примерно так же, но непосредственно в классе как атрибуты, а не в маппере:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    address = relation('Address', backref='user', cascade='all')

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))

(Обратите внимание, что я исправил написание "адреса", на случай, если вы вырезаете и вставляете это.)

Декларативная документация охватывает это. Обратите внимание, что в простых случаях он определяет, какие внешние ключи использовать автоматически, но при необходимости вы можете быть более точным.

Также обратите внимание на использование строки 'Address', поскольку в то время, когда я использую ее в классе User, связанный класс еще не был определен.

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