一瓶一瓶的关系 [英] One-to-one relationship in Flask
问题描述
__tablename__ ='image'
image_id = db.Column(db($ db
$ b pre $
.Integer,primary_key = True)
name = db.Column(db.String(8))
$ b $ 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_id = 1,name ='image1.png')
blindmap1 = Blindmap (module_id = 1,image_id = 1)
我遇到的错误是下面的错误。我不太清楚这个完整性错误是什么。我也试图在创建blindmap1时插入对象本身,但没有成功。
======== ================================================== ============
错误:test_commit_blindmap(__main __。TestCase)
---------------------- ------------------------------------------------
Traceback(最近一次调用最后一次):
在test_commit_blindmap
文件tests.py中,第183行blindmap1.add_label(label1)
文件/ home / thiago / Documents / ANU /MEDGg1/MEDG/LAWA/2014/trunk/app/models.py,第325行,在add_label
db.session.commit()
文件/usr/local/lib/python2.7 /dist-packages/sqlalchemy/orm/scoping.py,第150行,在
返回getattr(self.registry(),name)(* args,** kwargs)
文件/ usr /local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py,第776行,在提交
self.transaction.commit()
文件/ usr / local / lib /python2.7/dist-packages/sqlalchemy/orm/session.py,第377行,在提交
self._prepare_impl()
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py,第357行,在_prepare_impl
self.session.flush()
文件/ usr / local / lib / python2.7 / dist-packages / sqlalchemy / /lib/python2.7/dist-packages/sqlalchemy/orm/session.py,第2037行,在_flush
transaction.rollback(_capture_exception = True)
文件/ usr / local / lib / python2.7 / dist-packages / sqlalchemy / util / langhelpers.py,第60行,在__exit__
compat.reraise(exc_type,exc_value,exc_tb)
文件/ usr / local / lib / python2 .7 / dist-packages / sqlalchemy / orm / session.py,第2001行,在_flush
flush_context.execute()
文件/usr/local/lib/python2.7/dist-packages /sqlalchemy/orm/unitofwork.py,第372行,执行
rec.execute(self)
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/ unitofwork.py,第526行,执行
uow
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/ persistence.py,第65行,在save_obj
映射器,表,插入)
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py,第570行,在_emit_insert_statements
执行(语句,multiparams)
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py,行729,在执行
return meth(self,multiparams,params)
在_execute_on_connection $ b中的第321行文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py $ b返回connection._execute_clauseelement(self,multiparams,params)
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py,第826行,在_execute_clauseelement
compiled_sql,distilled_params
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py,行958,在_execute_context
上下文中)
文件/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py,行1160,在_handle_dbapi_exception
exc_info
文件/ usr / local / lib / python2 / usr / local / lib目录下的文件.7 / dist-packages / sqlalchemy / util / compat.py,第199行,在raise_from_cause
reraise(type(exception),exception,tb = exc_tb) /python2.7/dist-packages/sqlalchemy/engine/base.py,第951行,在_execute_context
上下文中)
文件/usr/local/lib/python2.7/dist-packages/ sqlalchemy / engine / default.py,第436行,在do_execute中
cursor.execute(语句,参数)
IntegrityError:(IntegrityError)UNIQUE约束失败:blindmap.module_id u'INSERT INTO blindmap(module_id, image_id)VALUES(?,?)'(1,1)
更清晰:到关系图和盲人地图。我的一对一的关系是不正确的,导致我的错误。我想知道是什么问题或创建一对一关系的正确方法。
你的关系是精细。
你的问题是,你自己设置你的主键(特别是在你的例子中的module_id)。
错误消息清楚地告诉你什么是错的:
数据库中已经有一个 Blindmap
,其中 module_id = 1
。
由于 module_id
是您的主键,您不能再插入第二个键。
试图自行设置主键和外键,让SQLAlchemy通过定义一个适当的关系为你做这个。
例如如:
http:// docs。 sqlalchemy.org/en/rel_0_9/orm/relationships.html#one-to-one :
class图片(db.Model):
__tablename__ ='image'
image_id = db.Column(db.Integer,primary_key = True)
name = db.Column(db.String(8))
#一对一关系
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'))
$ b image1 = Image(name ='image1.png')
blindmap1 = Blindmap()
blindmap1.image = image1
I'm trying to create a one-to-one relationship in Flask using SqlAlchemy. I followed this previous post and I created the classes like ones below:
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'))
Although it can migrate the model to the sqlite3 database, I have an error when I try to create a single object informing the value of the other class as the image_id. For example:
image1 = Image(image_id=1, name='image1.png')
blindmap1 = Blindmap(module_id=1, image_id=1)
And the error I have is the one that follows. I don't understand quite well what would be this integrity error. I also tried to insert the object itself in the creation of the blindmap1 but without success.
======================================================================
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)
Being clearer: The problem is related to the relation image and blindmap. My one-to-one relationship is not correct and result me in that error. I'd like to know what's the problem or a correct way to create one-to-one relationships.
Your relation is fine. Your issue is, that you set your primary keys yourself (specifically the module_id in your example).
The error message clearly tells you what's wrong:
There already is a Blindmap
with module_id = 1
in your database.
Since module_id
is your primary key, you can't insert a second one.
Instead of trying to set primary and foreign keys on your own, let SQLAlchemy do that for you, by defining a proper relationship.
E.g. as in: 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
这篇关于一瓶一瓶的关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!