天天看点

sqlalchemy 根据官方文档整理的知识点(还有待补充)

1、导入sqlalchemy并查看版本

import sqlalchemy

printf(sqlalchemy.version)

2、数据库连接(这里使用mysql database)

from sqlalchemy import create_engine

create_engine("mysql+pymysql://root:1qaz#[email protected]/db_ttr", encoding="utf-8", echo=True)

说明:

mysql+pymysql

mysql 表示使用的mysql数据库

pymysql 表示DBAPI,默认的DBAPI是mysqldb,可通过pip安装pymysql或mysqldb

3、声明一个映射

在使用ORM时,配置过程:1、首先描述我们要处理的数据库表,2、然后定义我们自己的类

这些类将映射到这些表。在SQLAlchemy中,这两个任务通常是一起执行的,使用一个名为Declarative,它允许我们创建包含指示的类,用来描述它们将被映射到的实际数据库表。

使用Declarative映射的类被定义为一个基类,它维护一个类和表相对于该基础的目录——这就是所谓的声明基类。

在通常导入的模块中,应用程序通常只有一个实例。我们使用declarative_base()函数创建基类,如下所示:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base() #基类

现在我们有了一个“Base”,我们可以用它来定义任意数量的映射类。我们将从一个名为users的表开始,它将使用我们的应用程序存

储最终用户的记录。一个名为User的新类将是我们映射该表的类。在这个类中,我们定义了将要映射的表的详细信息,

主要是表名,以及列的名称和数据类型:

from sqlalchemy import Column, Integer, String

class User(Base): #User类是映射该表的类

tablename = 'users' #表名users

4、创建一个模式

通过使用声明系统构造的用户类,我们已经定义了关于表的信息,即表元数据。

SQLAlchemy用来表示特定表的信息的对象称为table对象,这里声明性已经为我们做了一个。

通过检查table属性,我们可以看到这个对象:

In [10]: User.table

Out[10]: Table('users', MetaData(bind=None), Column('id', Integer(), table=<users>, primary_key=True, nullable=False), Column('name', String(), table=<users>), Column('fullname', String(), table=<users>), Column('password', String(), table=<users>), schema=None)

当我们声明我们的类时,声明使用Python元类,以便在类声明完成后执行其他活动;在这个阶段中,它根据我们的规范创建了一个表对象,

并通过构造一个Mapper对象将其与类关联起来。这个对象是我们通常不需要直接处理的幕后对象(尽管它可以提供大量关于我们需要它的映射的信息)。

表对象是一个称为元数据的更大集合的成员。当使用声明性的时候,这个对象可以使用。我们声明基类的元数据属性。元数据是一个注册表,

它包括向数据库发出有限的模式生成命令集的能力。由于我们的SQLite数据库实际上没有一个用户表,所以我们可以使用元数据为所有不存在的表向数据库发出CREATE table语句。

下面,我们调用MetaData.create_all()方法,将引擎作为数据库连接的源传递。我们将看到,首先发出特殊命令来检查users表的存在,

然后执行实际的CREATE table语句:

Base.metadata.create_all(engine) #执行实际的CREATE table语句,只有执行了这个语句才会真正的在数据库里创建表和插入数据

5、创建映射类的一个实例

通过完成映射,现在让我们创建并检查一个用户对象:

ed_user = User(name='tianran', fullname='tantianran', password='1qaz#EDC')

6、创建一个会话

现在我们可以开始与数据库对话了。ORM对数据库的“句柄”是会话。当我们第一次设置应用程序时,

在与create_engine()语句相同的级别上,我们定义了一个会话类,它将作为新会话对象的工厂:

>> from sqlalchemy.orm import sessionmaker >> Session = sessionmaker(bind=engine)

这个定制的会话类将创建绑定到我们数据库的新会话对象。在调用sessionmaker时也可以定义其他事务特性;

这些将在后面的章节中描述。然后,每当需要与数据库进行对话时,就实例化一个会话:

session = Session()

7、添加和更新对象

Session = sessionmaker(bind=engine)

session.add(ed_user)

在这一点上,我们说实例正在等待;还没有发出SQL,而且该对象还没有被数据库中的一行表示。会话将会发出SQL,在需要的时候,使用被称为“刷新”的进程,将琼斯尽快持久化。

如果我们为Ed Jones查询数据库,所有待处理的信息将首先被刷新,然后在此后立即发出查询。

例如,在下面我们创建一个新的查询对象,它加载用户实例。我们“过滤”了ed的name属性,

并指出我们只希望第一个结果出现在完整的行列表中。返回一个用户实例,

它相当于我们添加的内容:

our_user = session.query(User).filter_by(name='ed').first() 

print(our_user)

我们可以使用add_all()添加更多的用户对象:

session.add_all([

User(name='wendy', fullname='Wendy Williams', password='foobar'),

User(name='mary', fullname='Mary Contrary', password='xxg527'),

User(name='fred', fullname='Fred Flinstone', password='blah')]

)

如需要单独更新一条记录:

ed_user.password = 'f8s7ccs'

查看哪些记录是被修改过的:

session.dirty

查看等待提交的对象

session.new

提交会话(只有执行了这一步才会真在的将数据写入到数据库)

session.commit()

8、回滚操作

session.rollback()

如做了一些修改,在没有执行session.commit()之前,都可以进行回滚操作

9、查询

for instance in session.query(User).order_by(User.id):

print(instance.id,instance.name, instance.fullname, instance.password)

10、创建的过滤操作符

11、返回列表和标量

待补充。。。。

12、使用文本sql

待补充。。。

13、计数

14、建立一个关系

本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/2048610