gpt4 book ai didi

python - 创建 SQLAlchemy 对象时的自定义操作

转载 作者:行者123 更新时间:2023-11-29 18:55:26 25 4
gpt4 key购买 nike

假设我有一组用户,一组游戏,并且我在单独的表(名称:'game_progress')中跟踪用户是否完成了游戏。我希望每当创建用户时,“game_progress”表都会自动填充她的 ID 和针对所有可用游戏的“否”。 (我知道我可以等到她开始游戏来创造记录,但是,我需要这个用于完全不同的目的。)我将如何去做呢?

我尝试使用 after_insert() 事件。但是,我无法检索要插入“game_progress”的用户 ID。我不想使用 after_flush (即使我能弄清楚如何做到这一点),因为它可能有点矫枉过正,因为用户创建操作并不经常发生。

class Game(db.Model):

__tablename__ = 'games'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(30))

class User(db.Model):

__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(30))

class GameProgress(db.Model):

__tablename__ = 'game_progress'
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
game_id = db.Column(db.Integer, db.ForeignKey('games.id'), primary_key=True)
game_finished = db.Column(db.Boolean)

@event.listens_for(User, "after_insert")
def after_insert(mapper, connection, target):
progress_table = GameProgress.__table__
user_id = target.id
connection.execute(
progress_table.insert().\
values(user_id=user_id, game_id=1, game_finished=0)
)

db.create_all()
game = Game(name='Solitaire')
db.session.add(game)
db.session.commit()
user = User(name='Alice')
db.session.add(user)
db.session.commit()

最佳答案

您根本不需要对触发器或事件监听器做任何花哨的事情,您只需设置关系,然后在 User 的构造函数中创建相关对象即可。只要您定义了关系(您目前没有这样做,您只添加了外键),那么您不需要 User 有一个 id 来设置关联的对象。你的构造函数可以做这样的事情:


用户类(db.Model):
def __init__(self, all_games, **kwargs):
对于 kwargs.items() 中的 k,v:
setattr(自身,k,v)
对于 all_games 中的游戏:
self.game_progresses.append( GameProgress(游戏=游戏,\
user=self, game_finished=False) )

当您提交用户时,您还将提交一系列 GameProgress 对象,每个游戏一个。但上述取决于您在所有对象上建立关系。您需要将以下内容添加到 GameProgress 类


游戏=关系(“游戏”,backref =“game_progresses”)
用户=关系(“用户”,backref =“游戏进度”)

当您创建用户时,将游戏列表传递给用户:


all_games = dbs.query(游戏).all()
new_user = 用户(all_games=all_games, name="Iain")

完成后,您只需将 GameProgress 对象添加到检测列表 user.game_progresses 中,并且无需在第一次提交之前提交任何内容。 SQLA将追踪所有的关系。基本上,任何时候你需要直接处理 id 时,问问自己是否正确使用了 ORM,但很少需要这样做。 SQLA 文档上的 ORM 教程对此进行了很好的阐述。您可以将许多选项传递给关系和反向引用,以使级联执行您想要的操作。

关于python - 创建 SQLAlchemy 对象时的自定义操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44155232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com