我有一个Web搜寻器,它将根据第三个表中是否已存在一条记录,将链接插入到PostgreSQL数据库的两个表之一中。
使用SQLAlchemy定义表的方式如下:
NavigationService.navigate(action.payload);
给出了一对URL class Links(Base):
"""table of document --> document links between visited pages"""
__tablename__ = 'links'
id = Column(Integer, primary_key = True)
source = Column(Integer, ForeignKey("pages.id"), nullable=False)
target = Column(Integer, ForeignKey("pages.id"), nullable=False)
def __init__(self, source, target):
self.source = source
self.target = target
class URLFrontier(Base):
"""table of document --> URL links, from pages we've indexed to
those we haven't seen yet"""
__tablename__ = 'url_frontier'
id = Column(Integer, primary_key = True)
source = Column(Integer, ForeignKey("pages.id"), nullable=False)
target = Column(String, nullable=False)
def __init__(self, source, target):
self.source = source
self.target = target
class Page(Base):
"""A text document from a specific URL. Stores downloaded text content from web pages, and indexes for full-text search"""
__tablename__ = 'pages'
id = Column(Integer, primary_key = True)
url = Column(String)
title = Column(String)
text = Column(String)
last_visit = Column(DateTime)
word_positions = Column(TSVECTOR)
def __init__(self, url, title, text, last_visit):
self.url = url
self.title = title
self.text = text
self.last_visit = last_visit
self.word_positions = func.to_tsvector('simple', text)
,我正在尝试找到一种高效且线程安全的方法:
检查表(source_url, target_url)
中的记录是否存在,其中pages
字段== url
如果存在,我想在表中插入target_url
(source, target)
,并将网址映射到正确的links
和source
id,基于与target
表中id
字段匹配的URL。
如果不存在,我想将pages
插入到
表(source, target)
,其中url_frontier
映射到正确的source
id
,其中pages
仅作为URL字符串插入。**
我一直在尝试各种方法来执行此操作,例如,仅执行target
查询以检查记录是否存在,然后对适当的表进行SELECT
查询,但是这不是线程安全的(因为可以通过INSERT
和SELECT
之间的另一个线程修改数据)。我研究过的另一个选项是使用INSERT
,但似乎无法将其插入到另一个表中,或者如果可能的话,我无法从文档中弄清楚该如何做。如果UPDATE ... ON CONFLICT
中存在INSERT INTO links
,如何target
,否则插入pages
中呢?