使用SQLAlchemy实施ORM数据模型 – 优化数据库操作

18,889次阅读
没有评论

共计 5134 个字符,预计需要花费 13 分钟才能阅读完成。

使用 SQLAlchemy 强大的 ORM 处理应用程序的数据层。纯粹用 Python 定义数据模型、添加 / 删除记录以及执行查询。

使用 ORM 作为数据层是一个与面向对象编程本身一样古老的概念。通过抽象 SQL 概念,开发人员可以通过修改对象而不是查询来避免可怕的“上下文切换”。ORM 不仅仅是过度热衷的 OOP 时代慢慢衰落的产物;它也是 OOP 时代的产物。它们通过确保应用程序端的数据完整性来保证一定程度的持久性,从而最大限度地减少灾难性 SQL 查询的可能性。

ORM 允许开发人员通过修改代码中的对象(数据类)来处理数据,而不是对数据库执行 SQL 查询。此工作流程对于定期验证和修改数据(例如验证用户、修改配置文件、发布内容等)的面向用户的应用程序是有好处的。ORM 的亮点在于提供了一个用于处理频繁且可预测的操作的接口;这对于应用程序开发至关重要,但对于涉及数据分析的任何事情来说肯定是一种负担。

创建模型

数据模型是代表数据库中 SQL 表的 Python 类,其中模型的属性转换为表中的列。

使用 ORM 时,创建模型实例会转化为在 SQL 表中创建行。当然,这意味着我们需要先定义模型,然后才能编写任何有意义的业务逻辑。

我们通过定义 Python 类来创建模型,这些类扩展了 SQLAlchemy 中称为 declarative_base(). 我们这样定义模型“基础”对象:

"""SQLAlchemy 数据模型。"""
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

现在我们可以扩展 Base 以创建我们的第一个模型。按照传统,我们的第一个模型将是一个代表用户帐户的模型,恰当地命名为 User。我们将从简单开始:

"""SQLAlchemy 数据模型。"""
from sqlalchemy import Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import Integer, Text, String


Base = declarative_base()


class User(Base):
    """User account."""

    __tablename__ = "user"

    id = Column(Integer, primary_key=True, autoincrement="auto")
    username = Column(String(255), unique=True, nullable=False)
    password = Column(Text, nullable=False)

虽然上面的 Python 类可能是准系统,但它是一个完全有效的数据模型,它将生成一个包含三列(每个属性一列)的表:id、username 和 password。这些属性中的每一个都具有类型 Column(),这是 SQLAlchemy 独有的数据结构(因此我们包含 from sqlalchemy import Column)。

我们还导入了三个 SQLAlchemy“类型”,我们看到它们被传递到每个 Column. 每种类型对应一个 SQL 数据类型。因此,我们的 SQL 表列的数据类型将分别是 integer、varchar(255)和 text。

Columns 还可以接受键或列约束等可选参数:

  • Primary_key:将列指定为表的“主键”,这是强烈推荐的做法,它充当唯一标识符以及 SQL 搜索的索引。

  • 自动增量 primary_key:仅与类型为 且具有类型的列相关 Integer。我们创建的每个用户都会自动分配一个 id,其中第一个用户的 id 为 1,后续用户的 id 会相应增加。

  • unique:放置一个约束,其中没有两个记录 / 行共享给定列的相同值(我们不希望两个用户具有相同的用户名)。

  • nullable:当设置为 时 True,会添加一个约束,即该列是必需的,除非提供值,否则不会创建任何行。

  • key:在给定列上放置辅助键,通常与另一个约束(例如“索引”)一起使用。

  • index:指定列的值可以以非任意方式排序,以提高查询性能

  • server_default:如果未显式传递值,则分配默认值。

在我们的示例中,我们设置可选属性__tablename__来显式指定应命名哪个模型的相应 SQL 表。如果不存在,SQL 将使用类的名称来创建表。

有了所有这些知识,我们可以继续构建我们的模型:

...
from sqlalchemy.types import Integer, Text, String, DateTime
from sqlalchemy.sql import func


class User(Base):
    """User account."""

    __tablename__ = "user"

    id = Column(Integer, primary_key=True, autoincrement="auto")
    username = Column(String(255), unique=True, nullable=False)
    password = Column(Text, nullable=False)
    email = Column(String(255), unique=True, nullable=False)
    first_name = Column(String(255))
    last_name = Column(String(255))
    bio = Column(Text)
    avatar_url = Column(Text)
    created_at = Column(DateTime, server_default=func.now())
    updated_at = Column(DateTime, server_default=func.now())

    def __repr__(self):
        return f""

现在这是一个模型!我们在模型中添加了一些属性,每个属性都是不言自明的。和列演示了如何使用 SQLAlchemycreated_at 函数 updated_at 自动分配这些值。

最佳实践是设置__repr__数据模型(以及一般的 Python 类)的值,以便记录或调试我们的类实例。返回的值是我们在的实例__repr__时看到的值。如果您曾经不得不使用 Javascript 进行处理,那么您已经熟悉了调试对象的值却得不到任何有用的回报是多么令人讨厌。print()User[object Object]

我们的模型看起来不错,所以让我们用它创建一个 SQL 表。create_tables()我们通过调用创建模型后调用的方法来做到这一点:

从扩展的类创建 SQL 表 Base:

Base.metadata.create_all(engine)

一旦运行,SQLAlchemy 就会处理数据库端的所有事情,以创建与我们的模型匹配的表。如果您好奇,这就是我们的 User 模型输出的内容:

用于根据我们的数据模型创建表的 SQL 语句:

CREATE TABLE "user" (
  "id" int NOT NULL AUTO_INCREMENT,
  "username" varchar(255) NOT NULL,
  "password" text NOT NULL,
  "email" varchar(255) NOT NULL,
  "first_name" varchar(255) DEFAULT NULL,
  "last_name" varchar(255) DEFAULT NULL,
  "bio" text,
  "avatar_url" text,
  "last_seen" datetime DEFAULT NULL,
  "created_at" datetime DEFAULT CURRENT_TIMESTAMP,
  "updated_at" datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY ("id"),
  UNIQUE KEY "username" ("username"),
  UNIQUE KEY "email" ("email"));

创建会话

会话是一种持久的数据库连接,可让我们轻松添加、删除、更改甚至撤消更改。我们将使用 User 刚刚创建的模型通过数据库会话创建新用户。

会话是通过将它们绑定到 SQLAlchemy 引擎来创建的,我们在本系列的第 1 部分中介绍了该引擎。创建引擎后,我们所需要做的就是使用 SQLAlchemysessionmaker 定义会话并将其绑定到我们的引擎:

"""数据库引擎和会话创建。"""
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


engine = create_engine(
    'mysql+pymysql://user:password@host:3600/database',
    echo=True
)
Session = sessionmaker(bind=engine)
session = Session()

这就是所需要的一切!我们将 session 与我们的模型一起使用 User 来创建一些用户。

使用模型和会话创建记录

定义模型并创建会话后,我们可以纯粹使用 Python 添加和修改数据。SQLAlchemy 将此称为基于函数的查询构造。让我们看看从我们的类中创建一个新用户需要做什么 User:

from models import User
from database import session


user = User(
    username="admin",
    password="Please don't set passwords like this",
    email="admin@example.com",
    first_name="Todd",
    last_name="Birchard",
    bio="I write tutorials on the internet.",
    avatar_url="https://example.com/avatar.jpg"
)

session.add(user)  # 添加用户
session.commit()  # 提交更改

User 通过创建并保存为变量的实例 new_user,在数据库中创建该用户所需的只是对会话的两次调用:add()将项目排队等待创建,然后 commit()保存更改。我们现在应该在数据库的用户表中看到一行!

使用 session 方法很简单,只需四种简单的方法:

  • session.add():我们可以传递数据模型的实例来 add()快速创建要添加到数据库中的新记录。

  • session.delete():与上面一样,delete()接受数据模型的实例。如果该记录存在于我们的数据库中,它将被暂存以进行删除。

  • session.commit():在显式提交之前,不会保存会话中所做的更改。

  • session.close():与 SQLAlchemy 引擎不同,会话是在显式关闭之前保持打开状态的连接。

删除记录的语法与创建记录的语法非常相似。有了 user 变量,删除我们创建的用户就像下面一样简单:

session.delete(new_user)
session.commit()

new_user 就像魔术一样,我们通过简单地传递到删除方法来删除与我们之前创建的记录相匹配的记录。不要只相信我的话:这个过程中最令人满意的部分就是亲眼看到它发生!尝试使用您选择的 GUI 连接到数据库,并观察您运行的每行代码创建和删除的记录。

关键词:SQLAlchemy,ORM 数据模型,SQL 表,Python 类,数据模型 文章来源地址 https://www.toymoban.com/diary/sql/579.html

到此这篇关于使用 SQLAlchemy 实施 ORM 数据模型 – 优化数据库操作的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计5134字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)