阿里云服务器ECS    
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新 [咨询更多]
阿里云存储OSS
简单易用、多重冗余、数据备份高可靠、多层次安全防护安全性更强、低成本 [咨询更多]
阿里云数据库RDS
稳定可靠、可弹性伸缩、更拥有容灾、备份、恢复、监控、迁移等方面的全套解决方案 [咨询更多]
阿里云安全产品
DDoS高防IP、web应用防火墙、安骑士、sll证书、态势感知众多阿里云安全产品热销中 [咨询更多]
阿里云折扣优惠    
云服务器ECS、数据库、负载均衡等产品新购、续费、升级联系客服获取更多专属折扣 [咨询更多]
SQLAlchemy入门
2020-8-12    点击量:
  SQLAlchemy入门
  
  SQLAlchemy库用于与各种数据库交互,你可使用一种类似于Python类和语句的方式创建数据模型和查询。SQLAlchemy库是Mike Bayer在2005年创建的,现在大大小小很多公司都在使用它。事实上,许多公司都把SQLAlchemy看作在Python中使用关系型数据库的标准方式。
  
  SQLAlchemy可用于连接大多数常见的数据库,比如Post-gres、MySQL、SQLite、Oracle等。SQLAlchemy还提供了一种为其他关系型数据库添加支持的方式。Amazon Redshift(使用PostgreSQL自定义方言)就是SQLAlchemy社区添加的数据库支持的一个很好的例子。
  
  为什么使用SQLAlchemy?
  
  使用SQLAlchemy的首要原因是,它将你的代码从底层数据库及其相关的SQL特性中抽象出来。SQLAlchemy使用功能强大的常见语句和类型,确保其SQL语句为每种数据库和供应商正确、高效地构建出来,而无须你考虑这些。同时,这使得将逻辑从Oracle迁移到PostgreSQL或从应用程序数据库迁移到数据仓库变得很容易。它还有助于确保数据在提交到数据库之前得到“净化”并正确地进行了转义。这可以避免一些常见的问题,比如SQL注入攻击。SQLAlchemy提供了两种主要的使用模式——SQL表达式语言(通常称为Core)和ORM,这为我们使用SQLAlchemy提供了很大的灵活性。这两种模式可以单独使用,也可以一起使用,具体用法取决于你的喜好以及应用程序的需求。
  
  SQLAlchemy Core和SQL表达式语言
  
  SQL表达式语言允许我们以Python方式使用常见的SQL语句和表达式,它是对标准SQL语言的简单抽象。SQL表达式语言关注的是实际的数据库模式,它在经过标准化之后为大量后端数据库提供了一种一致性的语言。SQL表达式语言也是SQLAlchemy ORM的基础。ORM
  
  SQLAlchemy ORM类似于你在其他语言中遇到的对象关系映射(ORM)。它关注应用程序的领域模型,并利用工作单元模式来维护对象状态。它还在SQL表达式语言之上做了进一步的抽象,使用户能够以惯用的方式工作。你可以组合或搭配使用ORM与SQL表达式语言,从而创建出功能更为强大的应用程序。ORM中用到了一个声明式系统,该系统类似于许多其他ORM中使用的Active-Record系统,比如Ruby on Rails中使用的那个。
  
  虽然ORM极其有用,但你必须记住,类的关联方式和底层数据库关系的工作方式是有区别的。
  
  选择SQLAlchemy Core还是SQLAlchemy ORM
  
  在使用SQLAlchemy构建应用程序之前,你要决定主要使用ORM还是Core。选择使用Core还是ORM作为应用程序的主要数据访问层,通常取决于多个因素和个人偏好。
  
  Core和ORM使用的语法略有不同,但它们之间最大的区别是把数据看作模式还是业务对象。SQLAlchemy Core的视图以模式为中心,与传统SQL一样,它关注的是表、键和索引结构。SQLAlchemy Core在数据仓库、报表、分析和其他场景中(在这些场景中,严格控制对未建模的数据进行查询或操作将非常有用)可以大放异彩。强大的数据库连接池和结果集优化非常适合处理大量数据,甚至适合处理多个数据库的数据。
  
  但是,如果你主要关注的是领域驱动设计,那么选用ORM会更好,它会帮你把元数据和业务对象中的底层模式和结构封装起来。这种封装使得和数据库的交互变得更加容易,就像在使用普通的Python代码一样。大多数常见的应用程序都可以通过这种方式进行建模。ORM还可以有效地把领域驱动设计注入到遗留的应用程序或者到处是原始SQL语句的应用程序中。微服务也能从对底层数据库的抽象中获益,它使得开发人员可以只关注正在实现的流程。但是,由于ORM构建在SQLAlchemy Core之上,所以你也可以借助ORM使用Oracle数据仓库和Amazon Redshift这样的服务,就像和MySQL交互一样。因此,ORM很适合用来合并业务对象和仓库数据。下面列出了几种应用场景,了解它们有助于你在Core和ORM中做出最佳选择。
  
  •虽然你使用的框架中已经内置了ORM,但你希望添加更强大的报表功能,请选用Core。
  
  •如果你想在一个以模式为中心的视图中查看数据(用法类似于SQL),请使用Core。
  
  •如果你的数据不需要业务对象,请使用Core。
  
  •如果你要把数据看作业务对象,请使用ORM。
  
  •如果你想快速创建原型,请使用ORM。
  
  •如果你需要同时使用业务对象和其他与问题域无关的数据,请组合使用Core和ORM。
  
  你已经了解了SQLAlchemy的结构以及Core和ORM之间的区别,接下来开始安装并使用SQLAlchemy来连接数据库。
  
  安装SQLAlchemy并连接到数据库
  
  SQLAlchemy可以与Python 2.6、Python 3.3和PyPy 2.1或更高版本一起使用。建议使用pip来安装SQLAlchemy(使用命令pip install sqlalchemy)。值得注意的是,还可以使用easy_install和distutils来安装它。不过,相比之下,使用pip安装更简单。安装过程中,SQLAlchemy会尝试构建一些C扩展,这些扩展可以加快结果集的处理速度,同时提高内存使用效率。如果你的系统中缺少编译器,所以你想禁用这些扩展,那么可以使用--global-option=--without-cextensions。请注意,如果没有C扩展,SQLAlchemy的性能会受到影响。你应该在带有C扩展的系统上测试代码,然后再进行优化。
  
  安装数据库驱动程序
  
  默认情况下,SQLAlchemy直接支持SQLite3,不需要额外安装驱动程序。不过,在连接其他数据库时需要额外安装一个数据库驱动程序,并且该驱动程序要遵守标准的Python DBAPI规范(PEP-249)。这些DBAPI为各个数据库服务器所用的方言提供了基础,并且为不同数据库服务器和版本中的独特特性提供了支持。虽然许多数据库都有多种DBAPI可用,但我们将只介绍那些最常用的。
  
  •PostgreSQL
  
  Psycopg2为PostgreSQL的各个版本和特性提供了广泛的支持,你可以使用pip install psycopg2命令安装它。
  
  •MySQL
  
  PyMySQL是我用来连接MySQL数据库服务器的首选Python库。可以使用pip install pymysql命令安装它。SQLAlchemy支持MySQL 4.1及更高版本,这是由MySQL的密码工作方式造成的。另外,如果某些语句只在MySQL的某个版本中可用,那么,对于那些不支持这些语句的MySQL版本,SQLAlchemy不会为它们提供使用这些语句的方法。如果SQLAlchemy中的某个组件或函数在你的环境下不起作用,那你首先要做的是查看一下MySQL文档。
  
  •其他
  
  SQLAlchemy还可以与Drizzle、Firebird、Oracle、Sybase和Microsoft SQL Server一起使用。SQLAlchemy社区还为许多其他的数据库提供了外部方言,如IBM DB2、In-formix、Amazon Redshift、EXASolution、SAP SQL Any-where、Monet等。此外,SQLAlchemy还对创建方言提供了很好的支持,第7章将讲解相关内容。既然我们已经安装好SQLAlchemy和DBAPI了,接下来创建一个引擎去连接数据库。
  
  连接到数据库
  
  要连接到数据库,需要先创建一个SQLAlchemy引擎。SQLAlchemy引擎为数据库创建一个公共接口来执行SQL语句。这是通过包装数据库连接池和方言来实现的,这样它们就可以一起工作,提供对后端数据库的统一访问。如此一来,我们的Python代码就不必考虑数据库之间或DBAPI之间的差异了。
  
  SQLAlchemy提供了一个函数来创建引擎。在这个函数中,你可以指定连接字符串,以及其他一些可选的关键字参数。连接字符串是一种特殊格式的字符串,包含如下信息:
  
  •数据库类型(Postgres、MySQL等)
  
  •各数据库类型默认之外的方言(Psycopg2、PyMySQL等)
  
  •可选的认证细节(用户名和密码)
  
  •数据库位置(数据库服务器的文件或主机名)
  
  •数据库服务器端口(可选)
  
  •数据库名(可选)
  
  SQLite数据库连接字符串指定了一个特定的数据库文件或存储位置。示例P-1定义了一个存储在当前目录下、名为cook-ies.db的SQLite数据库文件,当前目录由第二行代码中的相对路径指定,第三行代码是一个内存数据库,第四行(Unix)和第五行(Windows)中指定了数据库文件的完整路径。在Windows平台下,连接字符串如最后一行代码所示;除非你使用原始字符串(r''),否则就要使用\\进行字符串转义。
  
  示例P-1 为SQLite数据库创建引擎
  
  from sqlalchemy import create_engineengine = create_engine('sqlite:///cookies.db')engine2 = create_engine('sqlite:///:memory:')engine3 = create_engine('sqlite:////home/cookiemonster/cookies.db')engine4 = create_engine('sqlite:///c:\\Users\\cookiemonster\\cookies.db')
  
  create_engine函数会返回一个引擎的实例。但是,在调用需要使用连接的操作(比如查询)之前,它实际上并不会打开连接。
  
  接下来,让我们为名为mydb的本地PostgreSQL数据库创建一个引擎。为此,我们先从sqlalchemy包导入create_engine函数。然后,使用create_engine函数创建引擎实例。在示例P-2中,你会看到我把postgresql+psycopg2用作连接字符串的引擎和方言组件,当然只使用postgres也可以。相比于隐式方式,我更喜欢显式方式,这也正是“Python之禅”(Zen of Python)所提倡的。
  
  示例P-2 为本地PostgreSQL数据库创建引擎
  
  from sqlalchemy import create_engineengine = create_engine('postgresql  

  +psycopg2://username:password@localhost:' \                       '5432/mydb')

       下面看看位于远程服务器上的MySQL数据库。在示例P-3中你会看到,在连接字符串之后,我们使用了一个关键字参数pool_recycle,用来指定回收连接的频率。

         示例P-3 为远程MySQL数据库创建引擎

         from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://cookiemonster:chocolatechip'                       '@mysql01.monster.internal/cookies', pool_recycle=3600)  

  默认情况下,超过8小时,MySQL才会关闭空闲连接。为了解决这个问题,可在创建引擎时把pool_recycle设置为3600,如示例P-3所示。
  
  create_engine函数还有一些可选参数,如下所示。
  
  •echo
  
  开启这个参数会记录引擎处理的操作,例如SQL语句及其参数。默认值为false。
  
  •encoding
  
  这个参数用于指定SQLAlchemy所使用的字符串编码方式,默认值为utf-8。大多数DBAPI默认支持这种编码。但这个参数并不用来指定后端数据库所使用的编码类型。
  
  •isolation_level
  
  这个参数用来为SQLAlchemy指定隔离级别。例如,使用Psycopg2的PostgreSQL拥有READ COMMITTED、READ UN-COMMITTED、REPEATABLE READ、SERIALIZABLE和AUTOCOM-MIT选项,默认值为READCOMMITTED。PyMySQL也有一样的选项,就InnoDB数据库来说,默认值为REPEAT-ABLEREAD。
  
  •pool_recycle
  
  设置这个参数会定期回收数据库连接或者让数据库连接超时。因为前面提到过的连接超时,这对MySQL非常重要。该参数的默认值为-1,表示不超时。
  
  可以使用isolation_level这个关键字参数为任何给定的DBAPI设置隔离级别。此外,还可以通过方言连接字符串中的键-值对来设置隔离级别,比如支持这个方法的Psycopg2。
  
  初始化引擎之后,就可以实际打开数据库连接了。这可以通过调用connect()方法实现,代码如下:
  
  from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://cookiemonster:chocolatechip' \                       '@mysql01.monster.internal/cookies', pool_recycle=3600)connection = engine.connect()
  
  现在我们有了一个数据库连接,接下来就可以开始使用SQLAlchemy Core或SQLAlchemy ORM了。
联系客服免费领取更多阿里云产品新购、续费升级折扣,叠加官网活动折上折更优惠