SQLAlchemy / PostgreSQL:如何根据第三个表中是否已存在记录将数据有条件地插入两个表之一

时间:2019-02-26 03:26:58

标签: python postgresql sqlalchemy sql-insert insert-into

我有一个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) ,我正在尝试找到一种高效且线程安全的方法:

  1. 检查表(source_url, target_url)中的记录是否存在,其中pages字段== url

  2. 如果存在,我想在表中插入target_url (source, target),并将网址映射到正确的linkssource id,基于与target表中id字段匹配的URL。

  3. 如果不存在,我想将pages插入到 表(source, target),其中url_frontier映射到正确的source id,其中pages仅作为URL字符串插入。**

我一直在尝试各种方法来执行此操作,例如,仅执行target查询以检查记录是否存在,然后对适当的表进行SELECT查询,但是这不是线程安全的(因为可以通过INSERTSELECT之间的另一个线程修改数据)。我研究过的另一个选项是使用INSERT,但似乎无法将其插入到另一个表中,或者如果可能的话,我无法从文档中弄清楚该如何做。如果UPDATE ... ON CONFLICT中存在INSERT INTO links,如何target,否则插入pages中呢?

0 个答案:

没有答案