0

저는 SqlAlchemy를 사용하여 Flask에서 일대일 관계를 만들려고합니다. 나는이 이전 post을 따라 나는 아래 것과 같은 클래스를 생성 :Flask의 일대일 관계

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) 

더 명확히하기 : 문제는 관계 이미지 및 blindmap과 관련이 있습니다. 내 일대일 관계가 정확하지 않으며 그 오류가 발생합니다. 나는 일대일 관계를 창출하기위한 문제 또는 올바른 방법이 무엇인지 알고 싶습니다.

+0

당신은 당신이 그들을 만들 때 모델로 ID-값을 전달할 필요가 없습니다. 데이터베이스가 생성합니다. – msvalkon

답변

5

관계가 정상입니다. 문제는 기본 키를 직접 설정하는 것입니다 (특히 example의 module_id).

오류 메시지는 무엇이 잘못되었는지 명확하게 알려줍니다. 데이터베이스에 module_id = 1 인 이미 Blindmap이 있습니다. 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 
+0

문제의 근본 원인을 테스트 단위로 생각했습니다. 나는 데이터베이스를 청소하는 것을 잊어 버렸고, 다시 테스트했을 때 데이터베이스의 고유 기본 키 오류가 발생했습니다. 그러나, 당신이하고있는 것처럼 관계를 만들기 위해 코드를 변경했습니다. 더 완벽 해 보인다. 고맙습니다! – Thiago