Индивидуальные отношения в колбе

Я пытаюсь создать отношения «один к одному» в Flask, используя SqlAlchemy. Я следил за этой предыдущей записью, и я создал классы, подобные приведенным ниже:

class Image(db.Model): __tablename__ = 'image' image_id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(8)) class Blindmap(db.Model): __tablename__ = 'blindmap' module_id = db.Column(db.Integer, primary_key = True) image_id = db.Column(db.Integer, ForeignKey('image.image_id')) 

Хотя он может мигрировать модель в базу данных sqlite3, у меня есть ошибка, когда я пытаюсь создать один объект, информирующий значение другого класса как image_id. Например:

 image1 = Image(image_id=1, name='image1.png') blindmap1 = Blindmap(module_id=1, image_id=1) 

И ошибка, которая у меня есть, следующая. Я не совсем понимаю, что это за ошибка целостности. Я также попытался вставить сам объект в создание blindmap1, но безуспешно.

 ====================================================================== ERROR: test_commit_blindmap (__main__.TestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "tests.py", line 183, in test_commit_blindmap blindmap1.add_label(label1) File "/home/thiago/Documents/ANU/MEDGg1/MEDG/LAWA/2014/trunk/app/models.py", line 325, in add_label db.session.commit() File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/scoping.py", line 150, in do return getattr(self.registry(), name)(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 776, in commit self.transaction.commit() File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 377, in commit self._prepare_impl() File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 357, in _prepare_impl self.session.flush() File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1919, in flush self._flush(objects) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2037, in _flush transaction.rollback(_capture_exception=True) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2001, in _flush flush_context.execute() File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 372, in execute rec.execute(self) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 526, in execute uow File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 65, in save_obj mapper, table, insert) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 570, in _emit_insert_statements execute(statement, multiparams) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 729, in execute return meth(self, multiparams, params) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 321, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement compiled_sql, distilled_params File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 958, in _execute_context context) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1160, in _handle_dbapi_exception exc_info File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause reraise(type(exception), exception, tb=exc_tb) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 951, in _execute_context context) File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 436, in do_execute cursor.execute(statement, parameters) IntegrityError: (IntegrityError) UNIQUE constraint failed: blindmap.module_id u'INSERT INTO blindmap (module_id, image_id) VALUES (?, ?)' (1, 1) 

Быть яснее: проблема связана с отношением образа и слепой. Мои отношения «один-к-одному» неверны и приводят меня к этой ошибке. Я хотел бы знать, в чем проблема или правильный способ создания отношений «один к одному».

One Solution collect form web for “Индивидуальные отношения в колбе”

Твоя связь прекрасна. Ваша проблема в том, что вы сами устанавливаете первичные ключи (в частности, module_id в вашем примере).

В сообщении об ошибке четко Blindmap что не так: в вашей базе уже есть Blindmap с module_id = 1 . Поскольку module_id является вашим основным ключом, вы не можете вставить второй.

Вместо того, чтобы пытаться самостоятельно установить первичные и внешние ключи, позвольте SQLAlchemy сделать это для вас, определив правильные отношения.

Например, например: http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#one-to-one :

 class Image(db.Model): __tablename__ = 'image' image_id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(8)) # the one-to-one relation blindmap = relationship("Blindmap", uselist=False, backref="image") class Blindmap(db.Model): __tablename__ = 'blindmap' module_id = db.Column(db.Integer, primary_key = True) image_id = db.Column(db.Integer, ForeignKey('image.image_id')) image1 = Image(name='image1.png') blindmap1 = Blindmap() blindmap1.image = image1 
  • Имеет ли SQLAlchemy эквивалент get_or_create Django?
  • 'str' Объект не имеет атрибута 'SubmitFeedResult'
  • Сравнение экземпляров объектов SQLAlchemy для равноправия атрибутов
  • Pythonic способ правильно отделить модель от приложения с помощью SQLAlchemy
  • Как рассчитать кумулятивное скользящее среднее в Python / SQLAlchemy / Flask
  • Flask-SQLAlchemy и Flask-Restless не заставляют внуков
  • Выполнение сопоставлений DateTime в фильтрах SQLAlchemy
  • SQLAlchemy: удаление каскада
  • Python - лучший язык программирования в мире.