SQLAlchemy没有将更改写入数据库

时间:2016-02-15 19:38:26

标签: python sqlalchemy

我在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的处理方式是否存在根本错误,我不知道?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您的代码无法正常工作的原因是因为SQLAlchemy不知道您的cards字典发生了变化,因此它不会发布更新。

您想要为它设置MutableDict

cards = Column(MutableDict.as_mutable(PickleType))

至于手动加载User.deck,你为什么要做一些ORM可以自动为你做的事情?那么如果你已经拥有User.decks怎么办?为什么这会阻止您与User.active_deckUser.deck关系?