Python 标签数据库-使用唯一列更新多对多表
我对数据库不是很有经验,可能完全走错了方向 我有两个表,链接和标记,以及一个关联表。我想用一个类似于Python 标签数据库-使用唯一列更新多对多表,python,database-design,sqlalchemy,Python,Database Design,Sqlalchemy,我对数据库不是很有经验,可能完全走错了方向 我有两个表,链接和标记,以及一个关联表。我想用一个类似于row=[tag,link]的输入更新这个数据库,但要确保我没有添加任何已经存在的标记或链接。所以我首先测试链接是否存在,然后测试标记是否存在,最后测试关联是否存在 这些表如下所示: tagslinks_assoc = Table( 'tagslinks', Base.metadata, # Column('id', Integer, primary_key=True), # N
row=[tag,link]
的输入更新这个数据库,但要确保我没有添加任何已经存在的标记或链接。所以我首先测试链接是否存在,然后测试标记是否存在,最后测试关联是否存在
这些表如下所示:
tagslinks_assoc = Table(
'tagslinks', Base.metadata,
# Column('id', Integer, primary_key=True), # Not sure if this is required
Column('tagid', Integer, ForeignKey('tags.tagid')),
Column('linkid', Integer, ForeignKey('links.linkid')))
class Tags(Base):
__tablename__ = 'tags'
tagid = Column(Integer, primary_key=True)
tag = Column(String, unique=True)
links = relationship("Links", secondary=tagslinks_assoc, backref="tags")
class Links(Base):
__tablename__ = 'links'
linkid = Column(Integer, primary_key=True)
link = Column(String, unique=True)
我正在检查链接和标记是否存在,如下所示:
link = session.query(Links).filter(Links.link == row[1]).first()
tag = session.query(Tags).filter(Tags.tag == row[0]).first()
如果标记和链接都已存在但尚未连接,我将如何更新它们之间的关联
sqlalchemy和/或数据库关系中是否存在使整个方法变得多余的东西
我一直在努力了解如何创建多对多关系,但我的领域都是独一无二的。也许他们不应该在那里?你就快到了。默认情况下,关系类似于列表,因此只需附加一个项即可创建新的关联。相反,将它们设置为检测重复项。集合中的内容需要覆盖
\uuuuuuuuuuuuuuuuuuuuuu散列
,以便正确检测重复项
class Tags(Base):
# ...
links = relationship(
'Links', tagslinks_assoc,
collection_class=set, # use a set to hold the collection
backref=backref('tags', collection_class=set)
)
def __hash__(self):
return hash((self.__class__, self.tag)) # any Tag with the same name hashes equal
class Links(Base):
# ...
def __hash__(self):
return hash((self.__class__, self.link))
现在获取标记,并将其添加到链接中。如果它已经存在,什么也不会发生
tag = session.query(Tags).filter(Tags.tag == 'my_tag').first()
link = session.query(Link).filter(Links.link == 'my_link').first()
link.tags.add(tag) # if it's already present, the hash will compare equal and nothing will happen
session.commit()
请参阅有关的文档
关于tagslinks_assoc表,在大多数情况下,每个表都应该有一个主键。在这种情况下,密钥将是tagid和linkid的复合
tagslinks_assoc = Table(
'tagslinks', Base.metadata,
Column('tagid', Integer, ForeignKey('tags.tagid'), primary_key=True),
Column('linkid', Integer, ForeignKey('links.linkid'), primary_key=True)
)