我最近使用Python和Sqlalchemy创建了一个CLI,该CLI需要使用联接表。对于那些在这个主题上有经验的人来说,使用SQLalchemy创建正常模型是一项非常简单的任务。但是,当您开始在多一对人际关系中加入这些模型时,事情很快就会变得复杂。实现与所有原始模型绑定的外国键,然后与数据库中的JOIN表进行交互,如果正确设置未正确设置,则会迅速导致许多令人困惑的错误消息。在我创建CLI的经验中,这是迄今为止更令人沮丧和令人困惑的任务之一。相比之下,我发现写python的函数非常简单。在这篇博客文章中,我将提供如何使用SQLalchemy创建一个简单的联接表并解释其背后的后勤工作的快速分解。
入门
在开始创建模型之前,我们需要进行一些导入,以确保我们可以按照所需的方式格式化模型并定义表记录应具有的数据。
您的sqlalchemy
会根据模型的需求导入我的外观,但是relationship
和declarative_base
是建立基本模型和表格关系的必要性。 Sqlalchemy的declarative_base
具有一些非常强大的功能,可以简化任何数据库框架所需的对象关系映射。声明性基础是数据库模型的基类,并结合了表定义和类定义。它简化了类映射,提供了对数据库查询的访问,并集成了会话以在我们的数据库上执行CRUD操作。
建立基本用户/游戏模型
构建基本模型是一项相对简单的任务,因为它们看起来很像香草python类。以下是我创建的模型:
表名称使用sqlalchemy属性__tablename__
可以通过Base
访问。然后,我们可以为数据库表定义所有列。这也是创建类实例的模型,该模型将从基础继承属性。最后,我们定义了魔术方法__repr__
(表示),该方法将创建类的实例格式化为人类可读字符串。当使用ipdb
调试代码时,或者在您需要出于任何原因将print()
的实例print()
作为班级实例时,这是非常有用的。
构建user_library
加入表
构建联接表与创建简单模型有很大不同。由于加入表将作为我们在users
和games
表之间多一对一关系的“介于两者之间”,因此我们需要实施外国钥匙的使用。这就是我对加入表建模的方式:
在我的联接表中,我将外键定义为user_id
,链接回users
表,而game_id
链接回games
表。然后,我们需要通过加入表建立User
类实例与Game
类实例之间的关系。我们通过使用sqlalchemy.orm
中内置的relationship()
函数来做到这一点。我们将user
定义为与User
类实例的关系,该实例将填充到user_library
表。 back_populates
参数用于建立User
和user_library
之间的双向关系。我们为Game
类实例关系做同样的事情。
将游戏/用户关系定义到user_library
建立我们多一到多的关系表的最后一步是在我们的Game
和User
模型中定义了user_library
属性。在这里注意语法非常重要,因为错误地定义这些关系可能会导致意外的错误或与数据库的交互。这就是我更新模型的方式:
由于我们正在链接游戏和用户实例的外键,因此我们需要在这两个模型中定义user_library
连接。重要的是,类属性的名称定义与联接表的名称匹配。在我的示例中,我将我的类属性定义为user_library
,它与连接的联接表相同。将User
模型视为示例,我们使用relationship
函数与User_library
实例建立关系,然后使用back_populates
建立与user
属性的双向关系,我们在User_library
模型中定义了。我在下图中绘制了箭头,以更清楚地展示我们建立的关系。
结论
这是关于如何构建联接表并建立表关系的基本教程。相信我,在使用超过3-4个表和/或多个联接表时,此过程可能会变得非常复杂。在创建看起来像杂乱无章的意大利面条的过程中,我创建了多个实体关系图,但是一旦我弄清楚,这是非常有意义的。希望我能够帮助您指导您完成该过程的基础知识,并帮助您解释为什么背后的原因。我将在下面启发本教程的项目中包含指向我的GitHub存储库的链接。愉快的编码大家!