sqlmodel学习笔记

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,
)
  1. back_populates(可选,字符串类型):用于指定与当前关系字段相对应的反向关系字段的名称。通过指定反向关系字段的名称,可以建立双向关系。默认值为 None,表示没有指定反向关系。

  2. link_model(可选,任意类型):用于指定与当前模型或表建立关系的关联模型。可以是关联模型的名称或引用。默认值为 None,表示没有指定关联模型。

  3. sa_relationship(可选,RelationshipProperty 类型):用于指定 SQLAlchemy 中的关系属性对象。默认值为 None,表示没有指定 SQLAlchemy 的关系属性。

  4. sa_relationship_args(可选,序列类型):用于传递额外的位置参数给 SQLAlchemy 的关系属性。可以是一个序列,包含要传递给关系属性的位置参数。默认值为 None,表示没有额外的位置参数。

  5. 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() 将更改保存到数据库中。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值