Object Relational Tutorial --SQLAlchemy 1.1 Documentation 的部分翻译

原创
2016/12/03 17:56
阅读数 93

SQLAlchemy ORM 给出一种用户定义的python类连接到数据库的表的方法,以及这些类的实例映射到对应的表的列的方法。它包括一个系统,这个系统同步所有的对象和其关联的行的改变。这个行称作工作单元。它还包括一个系统,用于表示数据库查询,(基于用户的类定义),以及用户是怎么定义各个类彼此之间的关系的。 ORM 与SQLAlchemy 的表达式语言形成对比,(基于orm的创建)。然而SQl表达式语言(在SQL Expression Language Tutorial有介绍),给出了一个系统,这个系统呈现了关系数据库的原始结构,ORM给出了一个高级的,抽象的使用方法,也就是表达式语言的应用。

在ORM和表达式语言的使用出现重叠的时候,俩者的相似性会比它们看起来要浅显。它们面向的是数据结构和数据体,这里说的是用户定义的模型的角度,在这里,它从下层的使用模型持续的刷新。其它的面相的是schema的字面和sql表达式代表的角度。这些角度明确的组成进数据库使用的消息。

一个成功的应用可能创建于使用ORM之上。在先进的情形下,一个以ORM创建的应用可能会直接使用表达式语言。(当然是在特定的数据库交互要求的前提下了)。 以下教程是doctest格式的,也就是说>>>代表你的python command prompt输入,而接下来的文本就是期待的返回值。 版本的快速检查。

连接: 本教程我们将会使用sqlite 数据库。要连接,我们可以使用create_engine():

echo 标记是一个快捷键,来搭建起SQLAlchemy的日志弹出,它是通过python的标准模块logging来完成的。当echo设置成enable的时候,我们就能看到sql语句的生成了。如果你跟着本教程,却不想看到有sql语句生成,设置成false就可以了。本教程将会格式化sql在一个弹出的窗口,这样他就不会挡着我们了。可以点击sql连接去看看什么被生产了。 create_engine的返回值是一个Engine的实例。它给我们呈现了一个数据库的核心界面。通过当前处理数据库和DBAPI的细节的方言,在此,是sqlite方言,它会去解释创建过程。(python 内建sqlite模块)。 一个方法像Engine.execute() or Engine.connect() 第一次被调用的时候。这个Engine就建立一个真的DBAPI连接到数据库,这个东西是要来发射sql语句的。当我们使用orm的时候,我们不会直接使用Engine来创建。而是待会我们见到的ORM,它在背后使用。

lazy connection: Engine,当第一次由create_engine返回的时候,不会直接连接到数据库,它会对数据库执行任务在第一次叫它去做的时候。道理和python的lazy function是一样的。 Declare a Mapping 声明一个映射 在使用ORM的时候,结构性的过程先由我们要处理的数据库表描述开始。然后由定义我们自己的类,这个类就是待会要映射的表,在现代的SQLAlchemy,这俩个任务通常是一起执行的。用一个叫Declarative的系统,它使我们可以创建带有指示以描述当前数据库表(将要映射的)的类。 映射类应的是Declarative 系统来定义,根据base class 。base class 维护着一个类的目录和表相对那个类,也叫declarative base class。 我们的应用通常只有一个这个base的实例,我们用declarative_base()函数创建一个base类。如下:

现在我们有了一个“base”,我们可以由它定义任何数量的映射类,我们讲使用一个单表叫users,它将为我们存记录给终端用户,一个新的类叫User将是我们映射到这个表的类,在这个类里,我们可以定义我们将要映射的表的具体细节,基本上是表名,名,以及列的数据类型。

一个类最少要有一个最小的需要,即__tablename__属性。以及最少要有一个主键列,SQLAlchemy从不做任何假设,但是这并不意味着样板文件就是必须的,相反,我们鼓励你创建自己的自动匹配的转换,使用helper函数和mixin类,这些类是描述具体的mixin和custom base class。

小贴士:User类定义一个__repr__方法,但是这是可选的,我们只实施它在我们的教程中,来展示我们的格式化后的User类。 当我们的类建立起来了,Declarative代替所有的列对象,用特别的python accessor,也叫decriptors。这是一个叫做instrumentation的过程。instrumented映射类将提供给我们一些手段来参照sql环境下的表,同时,继续加载column的值,从数据库里。 除了映射过程会对我们的类进行操作,类也保留了其他的大部分的普通python类,用这些我们能定义在我们的应用中需要的任何数量的普通特性和方法。 create a schema: 当我们的类由declarative系统构建起来后,我们就定义了我们的表的一些信息,也叫metadata。该对象使用SQLAlchemy来呈现这信息给一个叫做Table对象的特定的表,这里,Declarative已经建好一个给我们了。我们可以用__table__属性来查看。 当我们声明了我们的类,Declarative就用一个Python元类来实现额外的动作,一旦类声明完成后。在这个阶段,它随即建好一个Table对象,根据我们的指明。并关联它到我们的由Mapper对象建立的类。这个对象是一个背后对象,我们通常不会直接处理。(尽管它给我们提供了很多我们的映射的信息,当我们需要它的时候。) classical mappings:Declarative 系统,高度推荐,但是已经不是一个必须的了,当我们要用SQLAlchemy的ORM时候。除了Declarative,任何的Python类多能用mapper()函数直接的映射到任何一个表里。这些不是很常用的方法可以参见Classical Mappings。 Table对象其实是一个更大的集合MetaData的成员。当我们使用Declarative的时候。这个对象可以使用我们的declarative base class的.metadata属性。 MetaData是一个注册器,有发射一系列schema generation 命令到数据库的能力。因为我们的sqlite数据库目前还没有一个users表,我们就可以用MetaData来解决CREATE TABLE状态在数据库中还没有存在的问题。下面我们调用MetaData.create_all()方法。传递进去我们的Engine,作为一个数据库活动源我们将看到特别的命令立马发出去到当前的user表。以下就是当前CREATE TABLE的状态。 使用者可能熟悉CREATE TABLE的语法错误。错误指出了VARCHAR列没有一个length却生成了。在sqlite和postgresql,这是一个有效的数据类型。但是没有其他,也是被容许的。所以,如果在以下的数据库里运行我们的教程,你可能想要试用SQLAlchemy来解决CREATE TABLE,length可以如下写出:

String的长度,当然,还有Integer,Numeric等,没有引入SQLAlchemy当我们创建表的时候。(SQLAlchemy是有Integer,Numeric的) 此外,Firebird和Oracle要求一个序列来生成新主键,SQLAlchemy不会为你假设这些东西。对此,你可以使用Sequence构建:

一个完整的,十分简单的Table通过declarative 映射如下:

我们包涵这个冗长的表定义,分别去强调差别。。。。 创建映射实例类: 当映射完成后,我们就可以创建和查看一个User对象,。尽管我们没有在构建器里明确它。id属性仍然能生成一个None值,当我们获取它的时候。(这里是与一般的python报错给一个未定义的属性相反)SQLAlchemy的instrumentation一般能生成这个一个默认值给列映射对象,对这些我们已经赋值的属性,instrumentation系统会追踪这些赋值对于药 发射到数据库的INSERT状态。 init 方法:我们的User类,当定义的时候,就是使用Declarative系统,已经给我们提供了一个constructot。它会自动的接受关键字名字,这个关键字名字会去匹配我们的映射列。我们可以随心地去定义任何一个明确的__init__()方法。我们也可以重写这些默认方法,通过Declarative。 输入链接说明

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部