我在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)
将卡添加到甲板的功能如下:
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的处理方式是否存在根本错误,我不知道?
非常感谢任何帮助!
答案 0 :(得分:1)
您的代码无法正常工作的原因是因为SQLAlchemy不知道您的cards
字典发生了变化,因此它不会发布更新。
您想要为它设置MutableDict
:
cards = Column(MutableDict.as_mutable(PickleType))
至于手动加载User.deck
,你为什么要做一些ORM可以自动为你做的事情?那么如果你已经拥有User.decks
怎么办?为什么这会阻止您与User.active_deck
或User.deck
关系?