我遇到了一些 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 方法是否存在我不知道的根本错误?
任何帮助将不胜感激!
您的代码不起作用的原因是因为 SQLAlchemy 不知道您的
cards
字典已更改,因此它不会发出更新。
MutableDict
:
cards = Column(MutableDict.as_mutable(PickleType))
至于手动加载
User.deck
,为什么你要做一些ORM可以自动为你做的事情呢?如果您已经有 User.decks
又如何呢?为什么这会阻止您建立 User.active_deck
或 User.deck
关系?
对于遇到此问题的其他人来说,可能是数据库问题。就我而言,SQLite 无法跟上写入请求。它甚至不是为低负载而设计的。切换到 Postgresql 解决了我的写入丢失问题