python – 为什么SQLAlchemy / associationproxy复制我的标签?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 为什么SQLAlchemy / associationproxy复制我的标签?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2103字,纯文字阅读大概需要4分钟。
内容图文
![python – 为什么SQLAlchemy / associationproxy复制我的标签?](/upload/InfoBanner/zyjiaocheng/904/576f48200dec473b996e7c308c8d1578.jpg)
我正在尝试使用关联代理进行标记,与the example in the docs非常相似.这是我的模式的一个子集(它是一个博客),使用声明:
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
tag = Column(Unicode(255), unique=True, nullable=False)
class EntryTag(Base):
__tablename__ = 'entrytags'
entry_id = Column(Integer, ForeignKey('entries.id'), key='entry', primary_key=True)
tag_id = Column(Integer, ForeignKey('tags.id'), key='tag', primary_key=True)
class Entry(Base):
__tablename__ = 'entries'
id = Column(Integer, primary_key=True)
subject = Column(Unicode(255), nullable=False)
# some other fields here
_tags = relation('Tag', backref='entries', secondary=EntryTag.__table__)
tags = association_proxy('_tags','tag')
这是我试图使用它的方式:
>>> e = db.query(Entry).first()
>>> e.tags
[u'foo']
>>> e.tags = [u'foo', u'bar'] # really this is from a comma-separated input
db.commit()
Traceback (most recent call last):
[...]
sqlalchemy.exc.IntegrityError: (IntegrityError) duplicate key value violates unique constraint "tags_tag_key"
'INSERT INTO tags (id, tag) VALUES (%(id)s, %(tag)s)' {'tag': 'bar', 'id': 11L}
>>> map(lambda t:(t.id,t.tag), db.query(Tag).all())
[(1, u'foo'), (2, u'bar'), (3, u'baz')]
标签u’bar’已经以id 2存在;为什么SQLAlchemy没有附加那个而不是试图创建它?我的架构是否有问题?
解决方法:
免责声明:自从我使用SQLAlchemy以来已经很久了,所以这更像是一个猜测而不是任何东西.
看起来你期望SQLAlchemy神奇地接受字符串’bar’并在多对多表上执行插入时查找相关的Tag.我希望这是无效的,因为有问题的字段(‘tag’)不是主键.
想象一下类似的情况,你的Tag表实际上是Comment,也有id和文本字段.您希望能够使用您在上面使用的相同的e.comments = [‘u’Foo’,’u’Bar’]语法为条目添加评论,但您希望它只是执行INSERT,不检查具有相同内容的现有注释.
所以这可能就是它在这里所做的,但它会对你的标签名称产生唯一性约束并失败,假设你试图做错了.
怎么解决?使tags.tag成为主键可以说是正确的事情,虽然我不知道SQLAlchemy处理它的效率如何.如果失败,请尝试按名称查询Tag对象,然后再将其分配给条目.您可能必须编写一个带有unicode字符串的小实用程序函数,并返回现有标记或为您创建一个新标记.
内容总结
以上是互联网集市为您收集整理的python – 为什么SQLAlchemy / associationproxy复制我的标签?全部内容,希望文章能够帮你解决python – 为什么SQLAlchemy / associationproxy复制我的标签?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。