2020/02/01 01-SQLAlchemy引擎实体会话

ORM,对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库,之前操作都是pymysql,操作数据库都是直接把语句用链发给数据库

改成面向对象的实例的方法来操作数据库,但是这样并没有直接写SQL语句效率高
2020/02/01 01-SQLAlchemy引擎实体会话
表属性定义应该只有一份
2020/02/01 01-SQLAlchemy引擎实体会话
table映射class ,表映射为类
row映射object , 行映射为实例
column 映射property 字段映射为属性

2020/02/01 01-SQLAlchemy引擎实体会话
可以有类似下面的构造
student表有三个字段,有类属性,和实例属性,首先需要两个类,A类里面要用类属性,类属性等于B的实例,还要支持描述器协议
所谓的描述器协议,就是B类里必须实现某些方法(非数据描述器实现get,数据描述器实现get,set。delete),数据描述器的好处是,实例的属性相当于在操作数据描述器

2020/02/01 01-SQLAlchemy引擎实体会话
ORM在python中一般都需要使用描述器这种技术

SQLAlchemy是一个ORM框架
2020/02/01 01-SQLAlchemy引擎实体会话
参考文档
2020/02/01 01-SQLAlchemy引擎实体会话
查看first即可2020/02/01 01-SQLAlchemy引擎实体会话
对象关系
2020/02/01 01-SQLAlchemy引擎实体会话
这个网站想找内容比较麻烦,需要跳转很多

安装以后的版本 2020/02/01 01-SQLAlchemy引擎实体会话
echo = True 调试的时候,debug全部显示出来,调试的时候都打开,跟数据库链接封装在引擎里,2020/02/01 01-SQLAlchemy引擎实体会话
比较懒,如果不操作数据库,就不创建链接,在引擎内部维护了连接池,当 你真正操作数据库,会从链接池里拿一个链接给你用.
连接池,1.减少链接创建的时候的消耗,2.链接池可以控制访问的数目

2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
有方言,有DBAPI,方言指的是支持sql还是支持sqllite,oracle,引擎要管理链接池还要管理API的问题
2020/02/01 01-SQLAlchemy引擎实体会话
需要方言dialect(mysql,oracle,sqllite) +driver(mysqldb,pymysql)2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
现在创建了还没什么用。,所有是个懒链接,没有跟数据库实际操作,完全没有链接,需要的时候才从连接池拿个链接来归你用
2020/02/01 01-SQLAlchemy引擎实体会话
创建一个映射,从类到表,到记录的映射,需要实现一一对应关系。
这里用新的创建方式,用元类来生成基类,然后继承这个基类

2020/02/01 01-SQLAlchemy引擎实体会话
申明一个基类
2020/02/01 01-SQLAlchemy引擎实体会话
students继承自基类,所以走的元类路线不一样了,base的祖先类,元类已经改了,不走type 了
2020/02/01 01-SQLAlchemy引擎实体会话
下面写字段定义,用类属性来实现
2020/02/01 01-SQLAlchemy引擎实体会话
导入sqlalchemy,列字段column,常用的数据类型,integer,string
下面是在做column类的初始化工作

2020/02/01 01-SQLAlchemy引擎实体会话
源码里面告诉你column写什么东西
2020/02/01 01-SQLAlchemy引擎实体会话
为了解决不同数据库里的差异,里面写的代码非常多2020/02/01 01-SQLAlchemy引擎实体会话

nullable是否为空
2020/02/01 01-SQLAlchemy引擎实体会话
如何来使用,这样就创建好了
2020/02/01 01-SQLAlchemy引擎实体会话
在这里必须指定表名,不然报错
2020/02/01 01-SQLAlchemy引擎实体会话
打印出来,没看到一条sql语句2020/02/01 01-SQLAlchemy引擎实体会话
两个none,一个tom,tom是之前传进去的值
2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
这里string必须指定长度
2020/02/01 01-SQLAlchemy引擎实体会话
到现在为止定义了一个ORM映射的类以及类的一些定义
2020/02/01 01-SQLAlchemy引擎实体会话
懒链接,只有真正数据库执行任务的时候才链接
2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
也可以加一个自增的
2020/02/01 01-SQLAlchemy引擎实体会话
可以打印一下table,__tablename__是用来设置表明的
2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
加一个repr就出现信息了
2020/02/01 01-SQLAlchemy引擎实体会话
告诉你表名,元数据,column字段
2020/02/01 01-SQLAlchemy引擎实体会话
最重要的是需要设定表名
2020/02/01 01-SQLAlchemy引擎实体会话
创建实例
2020/02/01 01-SQLAlchemy引擎实体会话

想要把表创建出来
2020/02/01 01-SQLAlchemy引擎实体会话
每一个注册的表的类,这些类都是继承自base,元编程里是创建的metadata的属性,这个属性 记录了它所管理的所有的表

2020/02/01 01-SQLAlchemy引擎实体会话
现在是谁继承自base,谁就管理起来了
2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
当下所有的表的信息,base.metadata都知道,创建表就需要和数据库链接起来,需要把引擎绑定给它。
先把同名的表都drop掉,然后创建student表,最后commit

2020/02/01 01-SQLAlchemy引擎实体会话
前面额数据库进行交互2020/02/01 01-SQLAlchemy引擎实体会话
看完结构创建表
2020/02/01 01-SQLAlchemy引擎实体会话
student出来了
2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
这种方式基本不用
2020/02/01 01-SQLAlchemy引擎实体会话
一般写的可能错误,产生的语句和实际的create 语句有差异,一般用数据库模型构建工具,把表关系都构建完,用这种工具可以创建表,也可以把ORM的类全部生成完毕,这种工具都提供到数据库的转换2020/02/01 01-SQLAlchemy引擎实体会话
要看生成的语句是否是你想要的
2020/02/01 01-SQLAlchemy引擎实体会话
上面纯粹是用于练习

2020/02/01 01-SQLAlchemy引擎实体会话
建立一个链接就产生了一个会话
2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
下面就需要创建session,是从sqlalchemy.orm对象相关的,使用sessionmaker
2020/02/01 01-SQLAlchemy引擎实体会话
做一个会话绑定,下面需要一个会话对象来做

2020/02/01 01-SQLAlchemy引擎实体会话2020/02/01 01-SQLAlchemy引擎实体会话
执行一下,没有sql语句,到现在为止,只建立了会话,没有链接数据库,session只是有了,以后告诉它要用这个session,session一旦不做操作,就不会问你要链接,没有链接也就没有任何操作
2020/02/01 01-SQLAlchemy引擎实体会话
注意点:
session线程不安全,避免在不同线程里使用同一个session对象,每个线程自己create session对象出来。这个session对象就不要跨线程使用了,因为线程是不安全的。
session实例的是线程不安全的。也提供了多线程使用的session类,是一个threadlocal的session(threadlocal,线程本地相关的,为每个线程单位维护的一个session,用起来像一个全局的session。
(无非就是,在每个线程里用自己的session,还是别人统一给一个session,在不同的线程中切换session))

首先在使用的时候要建立ORM关系(建立对象关系映射),要考虑怎么链接数据库,engine,选择链接字符串,下面就是如何创建一个实体类,但是创建实体类,就必须先构建出基类,有了这个base基类,所有类都继承自base,就可以创建一个个实例。(如何创建表和drop表,但是比较危险)

session是与数据库操作必须建立的会话,线程不安全
2020/02/01 01-SQLAlchemy引擎实体会话