Уникальное ограничение для столбца в отношении "один ко многим" в SQLAlchemy и MySQL

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

class Branch(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(160))
    #foreign key for 'branches' in Account class. access with Branch.account
    account_id = db.Column(db.Integer, db.ForeignKey('account.id'))

class Account(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(160), unique=True)
    branches = db.relationship('Branch', backref = 'account', lazy = 'dynamic')

Поэтому, когда я добавил уникальное ограничение в столбец имени таблицы Branch, я не смог добавить одноименные ветки в разные учетные записи. Например, Сиэтл может быть филиалом для AccountA и AccountB.

Я хочу применить ограничение, которое проверяет уникальность только тогда, когда account.id совпадает. Это возможно?


person Chockomonkey    schedule 31.12.2014    source источник
comment
возможный дубликат sqlalchemy уникален для нескольких столбцов   -  person dirn    schedule 31.12.2014
comment
Точный дубликат. Спасибо за ссылку - это помогло мне с нужным мне решением!   -  person Chockomonkey    schedule 31.12.2014


Ответы (1)


Благодаря dirn, указав на дубликат, я добавил:

__table_args__ = (db.UniqueConstraint('account_id', 'name', name='_account_branch_uc'),
                 )

в мой класс Branch, а затем отправил его в базу данных с помощью alembic через:

def upgrade():
    op.create_unique_constraint('_account_branch_uc', 'branch', ['name','account_id'])

Однако я отмечу, что, поскольку я добавил это ограничение вручную через алебмику, я не уверен, правильно ли я добавил его в свою модель. Полагаю, я узнаю, когда я в конце концов сотру свою БД и начну новую.

ИЗМЕНИТЬ

Я накатил новую базу данных, и __table_args__ сверху работает правильно!

person Chockomonkey    schedule 31.12.2014