CompositeKey как внешний ключ в peewee с mysql

Я использую peewee в качестве ORM для базы данных mysql. У меня есть 3 таблицы в моей схеме: одна для устройств, одна для приложений и одна для результатов на устройство для каждого тестирующего приложения и тестируемого приложения. таблица APPS выглядит так:

package name | version name | version code |apk name

3 первых столбца являются моим первичным ключом, так как я хочу, чтобы каждая ревизия была в моей таблице, и я хочу, чтобы можно было легко фильтровать приложения в соответствии с определенным кодом версии (код версии увеличивается с ревизиями в git\svn, а имя версии представляет саму версию как взято из ветки разработки). Моя проблема начинается, когда я хочу иметь таблицу APPS в качестве справочной таблицы для моей таблицы TESTS, что означает, что каждый тест ссылается на APPS дважды, один раз для тестера и один раз для тестируемого приложения. Я не уверен, что это хорошая идея иметь внешний ключ с 3 полями (что делает его 6!) В моей таблице TESTS.

Любое хорошее решение для этого? Я попытался добавить поле _ID с автоматическим увеличением в качестве «КЛЮЧА», поэтому у меня будет числовое единственное поле для доступа, но ORM на самом деле не поддерживает его, и я как бы стиснул зубы, пытаясь это сделать.

Моя БД просто плохо организована или мне нужно просто заменить ORM? я думаю, что без ORM я, вероятно, справился бы с этим довольно легко...


person codeScriber    schedule 16.02.2014    source источник


Ответы (2)


Опции:

  1. Определите автоматически увеличивающийся первичный ключ в таблице APPS.
  2. Определите составной уникальный ключ в таблице APPS для столбцов pkg, ver и vcode.
  3. Используйте значение первичного ключа этой таблицы в качестве ссылки FK в дочерней таблице.
person Ravinder Reddy    schedule 16.02.2014
comment
выглядит как хорошее решение для меня! однако есть идеи, как реализовать такое поведение с peewee? , опять же, я могу реализовать свое собственное решение, которое будет работать в MYSQL, но я не могу реализовать его с peewee. - person codeScriber; 17.02.2014
comment
Я все еще младенец в Python. Не могу дать идеи по его реализации. - person Ravinder Reddy; 17.02.2014
comment
хорошо, понял, если случится худшее, я могу использовать: Apps.create_table(), которая создаст автоматически увеличивающуюся обычную таблицу без ограничений, а затем Apps.getdatabase().execute('ALTER TABLE APPS ADD CONSTRAINT limit_apps UNIQUE (pkg_name, version_name, version_code); тогда я приму ваш ответ, 10x! - person codeScriber; 17.02.2014

Это очень поздний ответ, но я хочу внести код для сообщения peewee о составном ключе, что-то вроде следующего. При использовании этой конструкции Peewee НЕ добавляет в таблицу столбец «id»:

class SillyTable(peewee.Model):
    field1 = peewee.IntegerField(null=False)
    field2 = peewee.IntegerField(null=False)
    # Composite key, no "id" column needed.
    class Meta:
        primary_key = peewee.CompositeKey('field1','field2')

Я использую peewee v2.6.3 и PyMySQL v0.6.3 для доступа к MySQL.

person chrisinmtown    schedule 28.08.2015