Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SQLAlchemy中创建类似集合的映射属性_Python_Sql_Orm_Sqlalchemy_Set - Fatal编程技术网

Python 在SQLAlchemy中创建类似集合的映射属性

Python 在SQLAlchemy中创建类似集合的映射属性,python,sql,orm,sqlalchemy,set,Python,Sql,Orm,Sqlalchemy,Set,我已经读了一些书并用谷歌搜索了一下,但仍然不确定是否有一种本机/内置的方法可以在SQLAlchemy对象中创建映射属性,该方法可以为类似的方案创建类似集合的属性: User UserTag +----+-----------------+ +---------+-----------+ | id | email | | user_id | tag | +----+-------

我已经读了一些书并用谷歌搜索了一下,但仍然不确定是否有一种本机/内置的方法可以在SQLAlchemy对象中创建映射属性,该方法可以为类似的方案创建类似集合的属性:

User                             UserTag
+----+-----------------+         +---------+-----------+
| id | email           |         | user_id | tag       |
+----+-----------------+         +---------+-----------+
| 1  | foo@example.com |         | 1       | footag    |
| 2  | bar@example.com |         | 1       | something |     
+----+-----------------+         | 1       | tagbar    |
                                 | 2       | something |
                                 | 2       | 3rdtag    |
                                 +---------+-----------+
因此,每个用户对象都有一个User.tags映射属性,该属性类似于一组字符串,或其行为类似于一组字符串-例如,以下操作将起作用:

>>> user = session.query(User).filter(User.id == 1).one()
>>> print user.tags
set(['tagbar', 'something', 'footag'])
要实现这一点,请使用:

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    email = Column(String, nullable=False)
    tags = relationship('UserTag', collection_class=set,
                        cascade="all, delete, delete-orphan")
    tagset = association_proxy(
        'tags', 'tag_name',
        creator=lambda tag_name: UserTag(tag_name=tag_name),
    )

class UserTag(Base):
    __tablename__ = 'user_tags'
    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    tag_name = Column(String, primary_key=True)
然后,您可以通过以下方式使用模型:

# create sample data
foo = User(
    email='foo@example.com',
    tagset={'footag', 'something', 'tagbar'}
)
bar = User(
    email='bar@example.com',
    tagset={'something', '3rdtag'}
)
session.add(foo)
session.add(bar)
session.commit()

bar = session.query(User).get(2)
assert 'something' in bar.tagset
bar.tagset.remove('something')
assert 'something' not in bar.tagset

此外,添加具有相同标记名值的UserTag将得到正确处理。

对于集合,您具体需要什么?独特性?O1查找?两者都有,不过老实说,查找时间并不关键,因为我不希望映射值的数量很大;每个用户最多可以有10个左右的标签,我主要想知道user.tags中是否有“tagbar”。映射的表有一个在user_id上定义的唯一键,因此在DB级别保证唯一性。对我来说,有一套或类似于套的数据结构是有意义的。