关于python和对象关系映射,您需要了解的一切

您可能听说过对象关系映射(ORM),但它们是什么?您如何使用它们?以下是您需要了解的有关ORMs和Python的所有信息。...

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

以下是您需要了解的有关ORMs和Python的所有信息。

什么是甲虫(an orm)?

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

这听起来可能很复杂,也没有必要,但它们可以为您节省大量时间,并有助于控制对数据库的访问。

这里有一个例子。比如说,每当你在数据库中**密码时,你都想对其进行散列,如网站密码安全中所述。对于简单的用例来说,这不是一个问题——您在**之前进行计算。但是,如果需要在代码中的许多位置**记录,该怎么办?如果另一个程序员**到您的表中,而您不知道该怎么办?

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

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

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

使用sqlalchemy的python中的orms

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

下面的示例都使用SQLAlchemy,这是一种流行的Python ORM,但是不管实现如何,许多原则都适用。

为sqlalchemy设置python

在开始之前,您需要使用SQLAlchemy为Python开发设置机器。

您需要使用Python3.6来遵循这些示例。虽然旧版本可以工作,但下面的代码在运行之前需要进行一些修改。不知道有什么不同?我们的Python常见问题解答涵盖了所有差异。

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

确保安装了PIP,即Python包管理器,它是Python的最新版本。

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

pip install SQLAlchemy-1.2.9

1.2.9是版本号。您可以不使用此选项来获取最新的软件包,但最好是具体说明。您不知道新版本何时会破坏您当前的代码。

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

炼金术中的模型

ORM的关键组件之一是模型。这是一个Python类,它概述了表应该是什么样子以及它应该如何工作。它是SQL中CREATETABLE语句的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

这段代码做了几件事。导入是必要的,以便Python了解在哪里可以找到它需要的SQLAlchemy模块。您的模型稍后将使用声明性的_库,它将配置任**模型以按预期工作。

create_引擎方法创建到数据库的新连接。如果您已经有一个数据库,则需要将sqlite://更改为您的数据库URI。实际上,这段代码将只在内存中创建一个新数据库。一旦代码执行完毕,数据库就会被销毁。

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

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

from sqlalchemy import Column, Integer, String

这将从SQLAlchemy导入列、整数和字符串模块。它们定义了数据库表、字段、列和数据类型的工作方式。

在声明性基础下,创建模型类:

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

这个简单的示例使用汽车,但是您的表可能包含任何数据。

每个类都必须继承基类。您的数据库表名在_tablename _;中定义。这应该与类名相同,但这只是一个建议,如果它们不匹配,任何东西都不会损坏。

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

继续添加最后一个导入,这次是ForeignKey模块。在列导入旁边添加以下内容:

from sqlalchemy import Column, ForeignKey, Integer, String

现在创建第二个模型类。此类称为车主,存储在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 = relati***hip(Cars)

这里介绍了几个新属性。car_id字段定义为外键。它链接到cars表中的id。注意如何使用小写的表名,而不是大写的类名。

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

如果您现在运行此代码,您将看到什么也没有发生。这是因为你还没有告诉它做任何明显的事情。

炼金术中的对象

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

写入数据

在本例中,您需要先将一些数据**数据库,然后才能读取它。如果使用的是现有数据库,则可能已有数据。不管怎样,知道如何**数据仍然非常有用。

您可能习惯于在SQL中编写INSERT语句。SQLAlchemy为您处理此问题。下面是如何在Cars模型中**一行。从sessionmaker的新导入开始:

from sqlalchemy.orm import sessionmaker

这是创建会话和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.commit将其写入数据库。

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

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

此代码与先前**的车型代码几乎相同。这里的主要区别是car_id是一个外键,因此需要另一个表中存在的行id。这是通过car1.id属性访问的。

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

读取数据

一旦你写了一些数据,你就可以开始读回它。以下是如何查询Cars和CarOwners表:

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

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

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表的链接。

有什么不喜欢的?

本教程只介绍了最基本的内容,但一旦掌握了其中的诀窍,就可以继续学习高级主题了。ORMs有一些潜在的缺点:

  • 您必须先编写模型,然后才能运行任何查询。
  • 这是另一个需要学习的新语法。
  • 对于简单的需求来说,它可能太复杂了。
  • 首先,您必须有一个良好的数据库设计。

这些问题本身并不是什么大问题,但它们是需要注意的。如果您使用的是现有数据库,您可能会被发现。

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

Subscribe to our newsletter

Join our newsletter for tech tips, reviews, free ebooks, and exclusive deals!

Click here to subscribe

  • 发表于 2021-08-05 21:19
  • 阅读 ( 228 )
  • 分类:编程

你可能感兴趣的文章

春天(spring)和冬眠(hibernate)的区别

...socket支持双向通信。Spring支持面向方面编程(AOP)。它是关于横切关注点的,它们与业务逻辑分离。春天的一些优点。总的来说,它是一个轻量级和全面的应用程序开发工具。 什么是冬眠(hibernate)? Hibernate是一个由redhat开发的...

  • 发布于 2020-10-19 14:07
  • 阅读 ( 282 )

json-python解析:简单指南

... 如果您正在寻找更多关于如何更好地使用它的示例,请查看这个使用Python构建社交媒体bot的指南。 ...

  • 发布于 2021-03-13 11:20
  • 阅读 ( 289 )

如何让python和javascript使用json进行通信

... 今天我将向您展示如何使用JSON将数据从JavaScript发送到Python。我将介绍如何设置一个web服务器,以及您需要的所有代码。 ...

  • 发布于 2021-03-16 01:22
  • 阅读 ( 300 )

帮助您快速学习的10个基本python示例

如果你今天要学习一门新语言,Python就是其中一种选择。它不仅相对容易学习,而且有许多实际用途,可以在不同的技术相关职业中派上用场。 ...

  • 发布于 2021-03-16 13:29
  • 阅读 ( 207 )

如何用python读写google工作表

Python是一种优秀的编程语言。语法可能看起来奇怪和不寻常,但它很容易学习和使用。它支持Minecraft Pi版,以及一系列网站和学术研究项目。 ...

  • 发布于 2021-03-16 13:43
  • 阅读 ( 587 )

如何使用pandas将excel数据导入python脚本

...程语言。这里不是手动将数据复制到数据库中,而是一个关于如何使用Pandas将Excel数据加载到Python中的快速教程。 ...

  • 发布于 2021-03-19 06:40
  • 阅读 ( 367 )

了解python lambda函数的初学者指南

... 在本文中,我们将解释您需要了解的关于这些神秘函数的一切,如何使用它们,以及它们为什么有用。 ...

  • 发布于 2021-03-24 12:14
  • 阅读 ( 248 )

python面向对象编程初学者指南

Python应用于从Raspberry Pi到机器学习的所有领域。但是,如果您想处理任何大型项目,您需要知道Python如何与面向对象编程(OOP)结合使用。本文将介绍您需要了解的基本知识。 ...

  • 发布于 2021-03-24 14:43
  • 阅读 ( 215 )

这些机器学习课程将为您准备一条职业道路

...学习课程之一,了解机器学习背后的基本技术。这是我们关于你能从中受益的最好的Udemy课程的连续系列的一部分。 ...

  • 发布于 2021-03-25 15:43
  • 阅读 ( 253 )

如何在python中创建简单类

...的内部细节。为了增加您对封装概念的理解,请参阅我们关于封装的文章。 ...

  • 发布于 2021-03-26 20:18
  • 阅读 ( 255 )
酒神灬吻
酒神灬吻

0 篇文章