Ant*_*nko 4 python sql sqlalchemy
我有两个简单的 SQLAlchemy 类:
papers2authors_table = Table('papers2authors', Base.metadata,
Column('paper_id', Integer, ForeignKey('papers.id')),
Column('author_id', Integer, ForeignKey('authors.id'))
)
class Paper(Base):
__tablename__ = "papers"
id = Column(Integer, primary_key=True)
title = Column(String)
handle = Column(String)
authors = relationship("Author",
secondary="papers2authors",
backref="papers")
class Author(Base):
__tablename__ = "authors"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
code = Column(String, unique=True)
Run Code Online (Sandbox Code Playgroud)
然后我在别处运行 init:
engine = create_engine('sqlite:///' + REPECI_DB, echo=True)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
self.s = session
Run Code Online (Sandbox Code Playgroud)
并尝试将项目添加到papers和authors:
paper = Paper()
for line in lines: # the data is a sequence of lines "key: value" with few papers per file
br = line.find(':')
k = line[:br]
v = line[br+1:].strip()
if k == "Title":
paper.title = v
elif k == "Year":
paper.year = v
elif k == "Author-Name":
try:
self.s.begin_nested()
author = Author(name=v)
except IntegrityError:
print("Duplicate author")
self.s.rollback()
author = self.s.query(Author).filter(Author.name==v).first()
else:
self.s.commit()
paper.authors.append(author)
elif k == "Handle": # this appears in the end of a paper's record
paper.handle = v
self.s.add(paper)
self.s.commit()
paper = Paper()
Run Code Online (Sandbox Code Playgroud)
但是作者出了点问题。将一些作者添加到表中后,出现(<class 'sqlalchemy.exc.IntegrityError'>, IntegrityError('(IntegrityError) UNIQUE constraint failed: authors.name',), None)错误。同时,数据库只有大约 50 位作者和一篇文章,而我处理的行包含的作者数量仅为文章的两倍左右。这意味着脚本根本不添加它们。
我尝试按照此处的建议重写代码,但仍然出现错误。
我找到了一个我不喜欢的解决方案,但它有效。替换这个:
try:
self.s.begin_nested()
author = Author(name=v)
except IntegrityError:
print("Duplicate author")
self.s.rollback()
author = self.s.query(Author).filter(Author.name==v).first()
else:
self.s.commit()
paper.authors.append(author)
Run Code Online (Sandbox Code Playgroud)
有了这个:
author = self.s.query(Author).filter(Author.name==v).first()
if author is None:
author = Author(name=v)
paper.authors.append(author)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4602 次 |
| 最近记录: |