您需要了解的有关Python和对象关系映射的所有信息

您可能听说过对象关系映射(ORM)。您甚至可能用过一个,但是它们到底是什么?以及如何在Python中使用它们?

这是您需要了解的有关ORM和Python的所有信息。

什么是ORM?

对象关系映射(ORM)是一种用于访问数据库的编程技术。它将您的数据库公开为一系列对象。您不必编写SQL命令来插入或检索数据,您可以使用附加到对象的一系列属性和方法。

这听起来很复杂和不必要,但是它们可以节省大量时间,并帮助控制对数据库的访问。

这里是一个示例。假设每次将密码插入数据库时​​,您都希望对其进行哈希处理,如网站密码安全性中所述。对于简单的用例来说,这不是问题,您可以在插入之前进行计算。但是,如果您需要在代码中的许多地方插入一条记录怎么办?如果另一个程序员插入您的表并且您不知道该怎么办?

通过使用ORM,您可以编写代码以确保无论何时何地都可以访问数据库中的任何行或字段,其他,则首先执行自定义代码。

这也充当“真理的单一来源"。如果要更改自定义计算,则只需在一个位置(而不是多个位置)进行更改。可以使用Python中的面向对象编程(OOP)来执行许多这些原理,但是ORM与OOP原理协同工作以控制对数据库的访问。

在使用时需要注意某些事项一个ORM,在某些情况下您可能不想使用它,但是通常认为它们是一件好事,尤其是在大型代码库中。

Python中使用SQLAlchemy的Python中的ORM

与Python中的许多任务一样,导入模块比编写自己的模块更快,更容易。当然,可以编写自己的ORM,但是为什么要重新发明轮子呢?

以下示例全部使用SQLAlchemy(一种流行的Python ORM),但是许多原理都适用,无论其实现如何。

在继续前进之前,您需要为使用SQLAlchemy的Python开发设置计算机。

您将需要使用Python 3.6以及这些示例。尽管较旧的版本可以运行,但是下面的代码需要进行一些修改才能运行。不确定差异吗?我们的Python常见问题解答涵盖了所有差异。

在编码之前,您应该设置一个Python环境,以防止其他导入的Python包出现问题。

请确保您拥有PIP,安装了Python软件包管理器,该软件包随大多数现代版本的Python一起提供。

一旦准备就绪,可以先准备好SQLAlchemy。在命令行的Python环境中,使用 pip install 命令安装SQLAlchemy:

pip install SQLAlchemy-1.2.9

1.2.9 是版本号。您可以不选择此项以获取最新软件包,但具体做法是一种很好的做法。您不知道新版本何时会破坏您的当前代码。

现在您可以开始编码了。您可能需要准备数据库以接受Python连接,但是以下示例均使用以下在内存中创建的SQLite数据库。

SQLAlchemy中的模型

关键组件之一ORM的名称是模型。这是一个Python类,概述了表的外观以及其工作方式。这是SQL中 CREATE TABLE 语句的ORM版本。您需要为数据库中的每个表建立模型。

打开您喜欢的文本编辑器或IDE,然后创建一个名为 test.py 的新文件。输入以下启动代码,保存文件并运行它:

from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()engine = create_engine('sqlite://') # Create the database in memoryBase.metadata.create_all(engine) # Create all the tables in the database

This code does several things. The imports are necessary so that Python understands where to find the SQLAlchemy modules it needs. Your models will use the declarative_base later on, and it configures any new models to work as expected.

create_engine 方法将创建与数据库的新连接。如果已经有数据库,则需要将 sqlite:// 更改为数据库URI。实际上,此代码将仅在内存中创建一个新数据库。一旦您的代码完成执行,数据库便被破坏。

最后, create_all 方法将在数据库中的模式下创建所有表。由于您尚未定义任何模型,因此什么也不会发生。继续并运行此代码,以确保您没有任何问题或错别字。

让我们做一个模型。在文件顶部添加另一个导入:

from sqlalchemy import Column, Integer, String

这将从以下位置导入整数 String 模块SQLAlchemy。它们定义了数据库表,字段,列和数据类型的工作方式。

declarative_base 下,创建模型类:

class Cars(Base):  __tablename__ = 'cars'  id = Column(Integer, primary_key=True)  make = Column(String(50), nullable=False)  color = Column(String(50), nullable=False)

汽车,但您的表中可能包含任何数据。

每个类都必须继承 Base 。您的数据库表名称在 __ tablename __ 中定义。该名称应与类名相同,但这只是一个建议,如果它们不匹配,则不会破坏任何内容。

最后,每一列都定义为该类中的python变量。使用了不同的数据类型,并且 primary_key 属性告诉SQLAlchemy创建 id 列作为主键。

继续并添加最后一个导入,这一次是 ForeignKey 模块。将此添加到您的导入旁边:

from sqlalchemy import Column, ForeignKey, Integer, String

现在创建第二个模型类。此类称为 CarOwners (汽车所有者),并存储存储在 Cars (汽车)表中的特定汽车的所有者详细信息:

class CarOwners(Base):  __tablename__ = 'carowners'  id = Column(Integer, primary_key=True)  name = Column(String(50), nullable=False)  age = Column(Integer, nullable=False)  car_id = Column(Integer, ForeignKey('cars.id'))  car = relationship(Cars)

此处引入了几个新属性。 car_id 字段定义为外键。它链接到汽车表中的 id 。请注意,如何使用小写的表名,并插入大写的类名。

最后,将 car 的属性定义为关系。这使您的模型可以通过此变量访问 Cars 表。如下所示。

如果立即运行此代码,您将看不到任何反应。这是因为您尚未告诉它做任何值得注意的事情。

SQLAlchemy中的对象

现在,您的模型已创建,您可以开始访问对象,并读取和写数据。将逻辑放入其自己的类和文件中是个好主意,但目前,它可以与模型并存。

在此示例中,需要先将一些数据插入数据库,然后才能读取它。如果您使用的是现有数据库,则可能已经有数据。无论哪种方式,了解如何插入数据仍然非常有用。

您可能习惯于在SQL中编写 INSERT 语句。 SQLAlchemy为您处理此问题。这是在汽车模型中插入一行的方法。从 sessionmaker 的新导入开始:

from sqlalchemy.orm import sessionmaker

这是创建 session DBSession 对象所必需的用于读取和写入数据的

DBSession = sessionmaker(bind=engine)session = DBSession()

现在将其放在您的 create_all 语句下面:

car1 = Cars(  make="Ford",  color="silver")session.add(car1)session.commit()

让我们分解一下代码。变量 car1 被定义为基于 Cars 模型的对象。其品牌和颜色设置为参数。这就像说“让我开车,但还没有将其写入数据库"。该汽车存在于内存中,但正在等待写入。

通过 session.add 将汽车添加到会话中,然后通过 session将其写入数据库。

现在让我们添加一个所有者:

owner1 = CarOwners(  name="Joe",  age="99",  car_id=(car1.id))session.add(owner1)session.commit()

此代码几乎与之前为 Cars 模型插入的代码相同。此处的主要区别是 car_id 是外键,因此需要另一个表中存在的行ID。这可以通过 car1.id 属性进行访问。

您不必查询数据库或返回任何ID,因为SQLAlchemy会为您处理(只要您提交即可)数据。)

一旦您写入了一些数据,就可以开始将其读回。下面是查询 Cars CarOwners 表的方法:

result = session.query(Cars).all()

就是这么简单。通过使用在会话中找到的 query 方法,您可以指定模型,然后使用 all 方法检索所有结果。如果您知道只有一个结果,则可以使用 first 方法:

result = session.query(Cars).first()

查询完模型并将返回的结果存储在变量中后,您可以通过对象访问数据:

print(result[0].color)

这将打印“银色"颜色,因为该记录是第一行。

在模型中定义关系时,无需指定联接就可以访问相关表中的数据。

result = session.query(CarOwners).all()print(result[0].name)print(result[0].car.color)

之所以可行,是因为您的模型包含表结构的详细信息,并且 car 属性已定义为指向 cars 表的链接。

不该做什么像About ORM一样?

本教程仅介绍了非常基础的知识,但是一旦掌握了这些知识,就可以继续学习高级主题。 ORM有一些潜在的缺点:

  • 您必须先编写模型,然后才能运行任何查询。
  • 这是另一个需要学习的新语法。
  • 它可能对于简单的需求来说太复杂了。
  • 您必须首先具有良好的数据库设计。
  • 这些问题本身并不是什么大问题,但是需要注意出来。如果您使用的是现有数据库,则可能会陷入困境。

    如果您不确信ORM是适合您的工具,那么请确保您了解程序员应该阅读的重要SQL命令。知道。

    标签: 编码教程 Python SQL