一、介绍

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

1、安装

    pip3 install sqlalchemy 

2、架构与流程

1036857-20170920102210540-1775435278.png

第一步:使用者通过ORM对象提交命令

第二步:将命令交给SQLAlchemy Core(Schema/Types  SQL Expression Language)转换成SQL

第三步:使用 Engine/ConnectionPooling/Dialect 进行数据库操作

        1)匹配使用者事先配置好的egine

        2)egine从连接池中取出一个链接

        3)基于该链接通过Dialect调用DB API,将SQL转交给它去执行

上述流程分析,可以大致分为两个阶段:

第一个阶段(流程1-2):将SQLAlchemy的对象换成可执行的sql语句

第二个阶段(流程3):将sql语句交给数据库执行

如果我们不依赖于SQLAlchemy的转换而自己写好sql语句,那意味着可以直接从第二个阶段开始执行了;我们完全可以只用SQLAlchemy执行纯sql语句,代码如下:

    from sqlalchemy import create_engine

    #1、准备

    #需要事先安装好pymysql

    #需要事先创建好数据库:create database db1 charset utf8;

    #2、创建引擎

    egine=create_engine('mysql+pymysql://root@127.0.0.1/db1?charset=utf8')

    #3、执行sql

    egine.execute('create table if not EXISTS t1(id int PRIMARY KEY auto_increment,name char(32));')

    cur=egine.execute('insert into t1 values(%s,%s);',[(1,"egon1"),(2,"egon2"),(3,"egon3")]) #按位置传值

    cur=egine.execute('insert into t1 values(%(id)s,%(name)s);',name='egon4',id=4) #按关键字传值

    #4 新插入行的自增id

    print(cur.lastrowid)

    #5、查询

    cur=egine.execute('select * from t1')

    cur.fetchone() #获取一行

    cur.fetchmany(2) #获取多行

    cur.fetchall() #获取所有行

3、DB API

SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

    1)MySQL-Python

        mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

    2)pymysql

        mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

    3)MySQL-Connector

        mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>

    4)cx_Oracle

        oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

二、创建表

ORM中:

    类===>表

    对象==>表中的一行记录

四张表:业务线,服务,用户,角色,利用ORM创建出它们,并建立好它们直接的关系

三、增删改查

表结构

1、增

2、删

3、改

4、查

四、其他查询相关

1、准备表和数据

2、条件、通配符、limit、排序、分组、连表、组合

3、子查询

有三种形式的子查询,注意:子查询的sql必须用括号包起来,尤其在形式三中需要注意这一点

 形式一:子查询当做一张表来用,调用subquery()

 形式二:子查询当做in的范围用,调用in_

 形式三:子查询当做select后的字段,调用as_scalar()

五、正查、反查

1、表修改

2、标准连表查询

#示例:查询员工名与其部门名

res=session.query(Emp.ename,Dep.dname).join(Dep) #迭代器

for row in res:

    print(row[0],row[1]) #等同于print(row.ename,row.dname)

3、基于relationship的正查、反查

#SQLAlchemy的relationship在内部帮我们做好表的链接

#查询员工名与其部门名(正向查)

    res=session.query(Emp)

    for row in res:

        print(row.ename,row.id,row.depart.dname)

#查询部门名以及该部门下的员工(反向查)

    res=session.query(Dep)

    for row in res:

        # print(row.dname,row.xxoo)

        print(row.dname,[r.ename for r in row.xxoo])