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

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

改成面向对象的实例的方法来操作数据库,但是这样并没有直接写SQL语句效率高
在这里插入图片描述
表属性定义应该只有一份
在这里插入图片描述
table映射class ,表映射为类
row映射object , 行映射为实例
column 映射property 字段映射为属性

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

在这里插入图片描述
ORM在python中一般都需要使用描述器这种技术

SQLAlchemy是一个ORM框架
在这里插入图片描述
参考文档
在这里插入图片描述
查看first即可在这里插入图片描述
对象关系
在这里插入图片描述
这个网站想找内容比较麻烦,需要跳转很多

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

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

在这里插入图片描述
申明一个基类
在这里插入图片描述
students继承自基类,所以走的元类路线不一样了,base的祖先类,元类已经改了,不走type 了
在这里插入图片描述
下面写字段定义,用类属性来实现
在这里插入图片描述
导入sqlalchemy,列字段column,常用的数据类型,integer,string
下面是在做column类的初始化工作

在这里插入图片描述
源码里面告诉你column写什么东西
在这里插入图片描述
为了解决不同数据库里的差异,里面写的代码非常多在这里插入图片描述

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

想要把表创建出来
在这里插入图片描述
每一个注册的表的类,这些类都是继承自base,元编程里是创建的metadata的属性,这个属性 记录了它所管理的所有的表

在这里插入图片描述
现在是谁继承自base,谁就管理起来了
在这里插入图片描述在这里插入图片描述
当下所有的表的信息,base.metadata都知道,创建表就需要和数据库链接起来,需要把引擎绑定给它。
先把同名的表都drop掉,然后创建student表,最后commit

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

在这里插入图片描述
建立一个链接就产生了一个会话
在这里插入图片描述在这里插入图片描述
下面就需要创建session,是从sqlalchemy.orm对象相关的,使用sessionmaker
在这里插入图片描述
做一个会话绑定,下面需要一个会话对象来做

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

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

session是与数据库操作必须建立的会话,线程不安全
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 1390, in _do_pre_synchronize query.whereclause) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 39, in process return meth(clause) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 81, in visit_clauselist evaluators = list(map(self.process, clause.clauses)) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 39, in process return meth(clause) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 111, in visit_binary [clause.left, clause.right])) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 39, in process return meth(clause) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 42, in visit_grouping return self.process(clause.element) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 39, in process return meth(clause) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py", line 105, in visit_clauselist clause.operator) sqlalchemy.orm.evaluator.UnevaluatableError: Cannot evaluate clauselist with operator <function comma_op at 0x7fe3ed7800e0> During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/srv/srv_x6/thirdpart/easemob/chartmsg.py", line 229, in send_sys_msg_to_person yield QyWxManage(business_id=business_id, user={}).qywx_send_msg(business_id, user_id_list, customer_content=sns_alert_sys_msg_model) File "/srv/srv_x6/services/qyWX/qyWX_manage.py", line 889, in qywx_send_msg update({Employee.qywx_user_id: ""}) File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3369, in update update_op.exec_() File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 1324, in exec_ self._do_pre_synchronize() File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 1401, in _do_pre_synchronize 'synchronize_session parameter.' % err) sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python: "Cannot evaluate clauselist with operator <function comma_op at 0x7fe3ed7800e0>". Specify 'fetch' or False for the synchronize_session parameter.
07-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值