1、主键和外键
class Info(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
user_id: int | None = Field(default=None, foreign_key="user.id")
指定id为主键,user_id为外键。其中id和user_id是实例属性。
2、relationship的用法
建立两个模型类之间的关系 关联字段
参数详解:
def Relationship(
*,
back_populates: Optional[str] = None,
link_model: Optional[Any] = None,
sa_relationship: Optional[RelationshipProperty[Any]] = None,
sa_relationship_args: Optional[Sequence[Any]] = None,
sa_relationship_kwargs: Optional[Mapping[str, Any]] = None,
)
-
back_populates
(可选,字符串类型):用于指定与当前关系字段相对应的反向关系字段的名称。通过指定反向关系字段的名称,可以建立双向关系。默认值为None
,表示没有指定反向关系。 -
link_model
(可选,任意类型):用于指定与当前模型或表建立关系的关联模型。可以是关联模型的名称或引用。默认值为None
,表示没有指定关联模型。 -
sa_relationship
(可选,RelationshipProperty
类型):用于指定 SQLAlchemy 中的关系属性对象。默认值为None
,表示没有指定 SQLAlchemy 的关系属性。 -
sa_relationship_args
(可选,序列类型):用于传递额外的位置参数给 SQLAlchemy 的关系属性。可以是一个序列,包含要传递给关系属性的位置参数。默认值为None
,表示没有额外的位置参数。 -
sa_relationship_kwargs
(可选,字典类型):用于传递额外的关键字参数给 SQLAlchemy 的关系属性。可以是一个字典,包含要传递给关系属性的关键字参数。默认值为None
,表示没有额外的关键字参数。
其中sa_relationship_kwargs的内容:
uselist
:布尔值,表示关系是否是一对多关系。当设置为False
时,表示关系是一对一关系。默认为True
,表示关系是一对多关系。lazy
:字符串,表示关系的加载策略。常见的选项包括"select"
、"joined"
、"subquery"
、"dynamic"
等。每个选项对应不同的关系加载方式。默认为"select"
。primaryjoin
:字符串或者Column
对象,表示关系的主键条件。可以是字符串形式的 SQL 表达式,或者是 SQLAlchemy 的Column
对象。用于指定关系的主键条件。secondary
:字符串、表名或者Table
对象,表示多对多关系中的中间表。可以是字符串形式的表名,或者是 SQLAlchemy 的Table
对象。用于指定多对多关系的中间表。
class Info(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str | None = Field(default=None)
age: int | None = Field(default=None)
user_id: int | None = Field(default=None, foreign_key="user.id")
user: User = Relationship(
back_populates="info", sa_relationship_kwargs={"uselist": False}
)
user是一个指向User的关联字段,可以在Info对象中访问与之关联的 User
对象。Info模型本身不直接存储 user
数据,而是通过关联字段 user
来引用相关的 User
模型的数据。要访问关联的 User
数据,需要通过访问Info实例的 user
字段来获取。
3、SQLite
SQLite 是一种嵌入式关系型数据库管理系统(RDBMS),它是一个开源的、零配置的、服务器端轻量级的数据库引擎。与传统的客户端-服务器模式的数据库管理系统不同,SQLite 是将数据库引擎嵌入到应用程序中,以库的形式提供对数据库的访问。
4、引擎(engine)
在数据库中,引擎(Engine)是指负责处理数据库操作的核心组件。它提供了与数据库进行交互的接口,负责执行 SQL 查询、处理数据的读取和写入等操作。
from sqlmodel import create_engine
engine = create_engine("sqlite:///database.db")
创建一个 SQLite 数据库引擎,用于连接到名为 "database.db" 的 SQLite 数据库文件。创建引擎后,可以使用该引擎执行数据库操作,如创建表格、插入数据、查询数据等。
SQLModel.metadata.create_all(engine)
SQLModel.metadata.create_all(engine)
是一个用于创建数据库表的方法调用。在给定的代码中,SQLModel
是一个可能是基于 SQL 的 ORM(对象关系映射)框架提供的基类,而 _engine
是一个数据库引擎对象。
metadata
是一个在 ORM 框架中常用的概念,它包含了关于数据库表结构的元数据信息,例如表名、字段、主键等。通过调用 metadata.create_all(engine)
方法,可以根据定义的模型类(继承自 SQLModel
)和其对应的元数据信息,在数据库中创建相应的表结构。
5、session(会话)
from sqlalchemy.orm import Session
# 创建会话对象
session = Session(engine)
.....
session.close()
使用 Session(engine)
创建了一个会话对象 session
with Session(engine) as session:
可以使用with.在 with
代码块的结束处,会话对象 session
会自动关闭,无需手动调用 session.close()
。
6、Sqlmodel会话对数据库数据操作的常用语法
(1)查询
query = select(User).where(User.username == "john")
result = session.exec(query)
users = result.fetchall()
select()
方法用于创建查询语句,可以通过添加过滤条件、排序、限制等来进一步定制查询。session.exec()
方法用于执行查询语句,并返回结果集。
statement = select(User) #查询 User 表中的所有记录
users = session.exec(statement).all() #返回所有记录
user = session.exec(statement).first() #返回第一个记录,包括该记录的所有属性和值
(2)插入
new_user = User(username="john", password="secret")
session.add(new_user)
session.commit()
用 session.add()
将其添加到会话中。
使用 session.commit()
将更改保存到数据库中。
(3)更新
user = session.get(User, 1)
user.username = "new_username"
session.commit()
使用 session.get()
获取 User
对象,并将其属性进行更新,尝试从数据库中获取 User
表中主键为 1
的记录。
其中session.get()
方法接受两个参数:模型类和主键值。
session.get(Model, primary_key_value)
使用 session.commit()
将更改保存到数据库中。
(4)删除
user = session.get(User, 1)
session.delete(user)
session.commit()
使用 session.get()
获取要删除的 User
对象,并使用 session.delete()
将其从会话中删除。
使用 session.commit()
将更改保存到数据库中。