mysql orm 框架_mysql八:ORM框架SQLAlchemy

一、介绍

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

1、安装

pip3 install sqlalchemy

2、架构与流程

51024ebdfa83b26efbb4492b8ca3950e.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://:@[:]/

2)pymysql

mysql+pymysql://:@/[?]

3)MySQL-Connector

mysql+mysqlconnector://:@[:]/

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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值