SQLAlchemy 未将更改写入数据库

问题描述 投票:0回答:2

我遇到了一些 SQLAlchemy 未写入更改的问题,或者更确切地说,调用 commit() 时更改会丢失。

我目前有一个卡牌、套牌(卡牌集合)和用户的数据库:

class Card(Base):
    id = Column(Integer, primary_key=True)
    # and a bunch of unrelated stuff

class Deck(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String)
    owner_id = Column(Integer, ForeignKey('users.id'))
    cards = Column(PickleType)

class User(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String)
    decks = relationship('Deck')
    active_deck_id = Column(Integer)
    deck = None

注意:Deck.cards 是一个 dict(),格式为 {Card.id : 卡片数量}

因此,当加载用户时,会发生以下情况:

def load_user(client, user):
    # bunch of unrelated stuff
    client.user = user
    if client.user.active_deck_id is not None:
        client.user.deck = db.session.query(db.Deck).get(client.user.active_deck_id)

将卡片添加到 Deck 的功能如下:

def add(args):
    # bunch of unrelated stuff
    card_name = ' '.join(args)
    s_card = db.session.query(db.Card).filter_by(name=card_name).first()
    if s_card is None:
        # errors & return
    if s_card.id in client.user.deck.cards:
        client.user.deck.cards[s_card.id] += 1
    else:
        client.user.deck.cards[s_card.id] = 1
    db.session.commit()

据我所知,add() 函数工作正常,但是当调用 commit() 时,更改会丢失。

我感觉 User.deck 应该是一种关系,但问题是 User.decks 已经存在了。

我的 User.deck 方法是否存在我不知道的根本错误?

任何帮助将不胜感激!

python sqlalchemy
2个回答
1
投票

您的代码不起作用的原因是因为 SQLAlchemy 不知道您的

cards
字典已更改,因此它不会发出更新。

您需要为其设置一个

MutableDict

cards = Column(MutableDict.as_mutable(PickleType))

至于手动加载

User.deck
,为什么你要做一些ORM可以自动为你做的事情呢?如果您已经有
User.decks
又如何呢?为什么这会阻止您建立
User.active_deck
User.deck
关系?


0
投票

对于遇到此问题的其他人来说,可能是数据库问题。就我而言,SQLite 无法跟上写入请求。它甚至不是为低负载而设计的。切换到 Postgresql 解决了我的写入丢失问题

© www.soinside.com 2019 - 2024. All rights reserved.