簡體   English   中英

如何使用SQLAlchemy將新記錄插入到有關每個現有數據的關聯表中

[英]How can I do insert a new record to an associative table about each existing data by using SQLAlchemy

環境:python3.7,SQLAlchemy1.3,SQLite3.22

我定義了2個表和1個關聯表,如下所示。

# associative table
taggings = Table('taggings', Base.metadata, 
    Column('id', Integer, primary_key=True),
    Column('article_id', Integer, ForeignKey('articles.id'), nullable=False),
    Column('tag_name', Integer, ForeignKey('tags.name'), nullable=False),
)

# mapper about article master
class Article(Base):
    __tablename__ = 'articles'
    id = Column(Integer, primary_key=True)
    ...
    tags = relationship('Tag', secondary=taggings, backref='articles')

# mapper about tag master
class Tag(Base):
    __tablename__ = 'tags'
    name = Column(String, primary_key=True)

現在,我希望能夠創建帶有任何現有標簽的新文章。 所以,我嘗試過...

new_one = Article(**payload.article)
new_one.tags = [Tag(name=x) for x in payload.tags]  # these tags are already stored in database.
sesion.add(new_one)
session.flush()

並進行測試,但是出現關於UNIQUE約束的錯誤。 細節在這里。

*** sqlalchemy.exc.IntegrityError:(sqlite3.IntegrityError)唯一約束失敗:tags.name [SQL:'INSERT INTO tags(name)VALUES(?)'] [參數:(('x',),(' a',))](此錯誤的背景位於: http : //sqlalche.me/e/gkpj

我猜session.add總是嘗試在父元素有子元素時插入,這里顯示的“子元素”可能是Tag 但我真的很想做的僅僅是對創造新的記錄taggings表引用新的文章數據和任何現有的標記。

在官方文檔中了解了有關層疊的信息 ,並嘗試從relationship()刪除save-update選項,但未解決。

請如何解決這個問題。

考慮到您對我的問題的回答,您應該添加檢查是否payload的標記尚未存在於數據庫中。 所以應該是這樣的:

new_one = Article(**payload.article)
tags = []
for tag_name in payload.tags:
    tag = session.query(Tag).filter_by(name=tag_name).first()
    # tag will be None if it does not exist in the database
    tags.append(tag if tag else Tag(name=tag_name))
new_one.tags = tags
sesion.add(new_one)
session.flush()

因此,如果數據庫中已經存在現有標簽,那么現在將使用它;如果沒有,請使用一個新標簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM