python orm框架sqlalchemy_python ORM框架:SqlAlchemy

ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库做替代

第一部分

SqlAlchemy本身无法直接操作数据库,它是建立在第三方数据库API(如python 中的pymysql库)之上,应用程序调用对象模型进行增删改查等操作时,将对象转化成sql语句,然后再通过API调用执行已经转换好的sql语句

安装

pip install sqlalchemy

pip install pymysql #这里笔者使用的数据API是pymysql

应用

- 配置及创建数据库引擎

SqlAlchemy 支持间接调用多种数据库API,根据不能的配置文件调用不同的数据库API

#常见配置文件:即database url,创建数据库引擎需要

MySQL-Python:mysql+mysqldb://:@[:]/

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

MySQL-Connector:mysql+mysqlconnector://:@[:]/

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

- 创建数据库引擎

* 注意 *:带上charset=utf8参数,防止中文乱码

#初始化数据库连接

from sqlalchemy import create_engine

url="mysql+pymysql://[账号]:[密码]@[主机]:[端口]/[数据库]?charset=utf8" #这里笔者使用的mysql数据库,pymysql API与数据库交互,添加的charset可防止中文乱码

engine=create_engine(url,echo=False,encoding="utf-8") #url为配置文件,echo调试参数,值为为true打印整个sql执行过程

- 创建会话(session)

通过sessionmaker工厂方法,我们得到一个类,默认返回Session类,也可以自定义Session类

方法:

sessionmaker( bind=None, class_=Session, autoflush=True,autocommit=False,expire_on_commit=True,info=None, **kw)

#示例1:直接调用sessionmaker

from sqlalchemy.orm import sessionmaker

SessionClass=sessionmaker(bind=engine)#利用工厂模式获取SessionClass

session_obj=SessionClass() #创建session对象,此时已绑定数据库引擎,但是未关联任何的对象模型

#示例1:使用scoped_session

from sqlalchemy.orm import scoped_session

SessionClass=scoped_session(sessionmaker(bind=engine))#利用工厂模式获取SessionClass

session_obj=SessionClass() #创建session对象,此时已绑定数据库引擎,但是未关联任何的对象模型

scoped_session VS Session

Session:多次创建的Session对象是不同的

scoped_session:首先通过sessionmaker工厂创建Session对象,然后对Session对象进行相应的管理(先在Registry中找之前是否创建过Session,若没有,则创建并注册,有,则直接返回),这样的目的:同一个线程维护一个session对象,保证了线程的安全性

- 与数据库交互

常用操作:与sql语言一致,主要是增删改查,接下来就简要概述这4大类

******* 增 *******

session.add(object) #在数据库中增加一个对象实例

session.add_all([object]) #在数据库中增加多个对象实例,参数为列表形式

session.commit() #提交,否则未入口

******* 查 *******

#备注:以下均已object代表对象模型,object.prop代表对象object的prop属性

session.query(object) #查询object对应的关系表,相当于select * from tables

session.query(object).first() #查询结果取第一条,没有返回none

session.query(object).filter(object.prop) #条件查询,filter相当于where

session.query(object).order_by(object.prop) #排序,默认升序,降序用desc

session.query(object).order_by(object.prop.desc()).limit(10) #降序,及限制10条

session.query(object.prop.label("别名")).filter(object.prop.like("%同同mony")) #模糊查询及给字段取别名

#使用聚合函数,sum、count等

from sqlalchemy import func

session.query(func.sum(object.prop).label("别名")

******* 改 *******

session.query(object).filter(object.prop>20).update({"prop1": 'values'})#批量更新,若没有过滤条件,这更新表中所有记录

myuser = Session.query(object).filter(object.prop>20).first()

object.prop2= 'value2' #单条更新,可直接修改对象

session.commit()

******* 删 *******

res = session.query(object).filter(object.prop>20).delete()

session.commit()

第二部分

掌握了基本概念和使用,为了更高效、更快捷将关系表转化成对象,不得不提sqlacodegen工具

a.安装

pip install sqlacodegen

b.使用

sqlacodegen url [opts]

这里的url就是sqlalchemy中create_engine使用的参数,但是当账号密码含有特殊字符时,同样的url,在sqlacodegen命令中会报错,识别不出账号、密码、端口等信息,此时可通过给账号和密码加引号解决

opts:

--tables TABLES 指定表,默认将所有表转化成对象

--noindexes 忽略索引

--noviews 忽略视图

--noclasses 不生成类,仅生成表

--outfile OUTFILE 输出文件

示例:

sqlacodegen --noviews --noconstraints --noclasses --noindexes --outfile 对应py文件路径 url【同create engine处使用的】

注意 :当账号和密码包含特殊字符时,需要用引号,否则自动识别不出账号、密码、端口等信息

示例1:

#不使用 `--noclasses`导出的对象

from sqlalchemy import BIGINT, Column, DateTime, Float, String, text

from sqlalchemy.dialects.mysql.types import TINYINT

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

metadata = Base.metadata

class TDeviceActivate(Base):

__tablename__ = 't_device_activate'

id = Column(BIGINT(10), nullable=False)

user_id = Column(BIGINT(10), nullable=False)

device_id = Column(String(32), primary_key=True, nullable=False)

mac = Column(String(30))

uuid = Column(String(32))

firmware_type = Column(String(16), primary_key=True, nullable=False)

activate_time = Column(DateTime, nullable=False)

create_date = Column(DateTime, nullable=False)

ip_address = Column(String(50))

longitude = Column(Float(10))

latitude = Column(Float(10))

expires_time = Column(DateTime)

type = Column(TINYINT(10), server_default=text("'1'"))

示例2

#使用 `--noclasses`参数导出的对象

from sqlalchemy import BIGINT, Column, DateTime, Float, MetaData, String, Table, text

from sqlalchemy.dialects.mysql.types import TINYINT

metadata = MetaData()

t_t_device_activate = Table(

't_device_activate', metadata,

Column('id', BIGINT(10), nullable=False),

Column('user_id', BIGINT(10), nullable=False),

Column('device_id', String(32), primary_key=True, nullable=False),

Column('mac', String(30)),

Column('uuid', String(32)),

Column('firmware_type', String(16), primary_key=True, nullable=False),

Column('activate_time', DateTime, nullable=False),

Column('create_date', DateTime, nullable=False),

Column('ip_address', String(50)),

Column('longitude', Float(10)),

Column('latitude', Float(10)),

Column('expires_time', DateTime),

Column('type', TINYINT(10), server_default=text("'1'"))

)

总结

在UI回归测试脚本中,通常涉及到与数据库打交道,开始时候主要使用pymysql API 与数据交互,但是随着使用频率的增加,直接书写sql变得繁琐,便尝试使用orm的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javadoc提取工具_使JavaDoc保持最新状态的工具

javadoc提取工具在许多项目中,文档不是最新的。 更改代码后,很容易忘记更改文档。 原因是可以理解的。 在代码中进行更改,然后进行调试,然后希望在测试中进行更改(或者,如果您使用的是更多TDD,则…

栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

【0】README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现; 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理清它…

用户/账户/账号的理解

文章目录用户账户账号关系用户 用户概念的理解: 用户就是使用者,可以是个人用户,也可以是机构用户。 账户 账户概念的理解: 账户,所谓“账”,就是系统根据“账”来存储和管理数据,类似记账…

azure 部署java_jClarity:在Azure上升级到Java

azure 部署java在互联世界公共基础设施的新时代,最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此,许多公司将时间和资源投入到构建最先进的技术上,以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量,而且免费…

黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾

2010年刚上大学那会,入手了人生第一台笔记本电脑,两边密密麻麻的各种接口,也没感觉到接口多少的价值;2016年年中入手了人生第一台苹果笔记本,第一次觉得电脑接口不够用;如今四年过去了电脑也到了更新换代的…

利用树的先序和后序遍历打印os中的目录树

【0】README0.1)本代码均为原创,旨在将树的遍历应用一下下以加深印象而已;(回答了学习树的遍历到底有什么用的问题?)你对比下linux 中的文件树 和我的打印结果就明理了;0.2)我们采用…

Hibernate常用API

文章目录删除指定的记录新增记录更新记录清空缓存将实体对象从缓存中清除将缓存中更新的数据同步到数据库把数据库中的数据刷到缓存中查询多个对象(也就是查询多条记录)查询指定ID的对象(查询指定ID值的记录)参考删除指定的记录 U…

solid设计原则_SOLID设计原则

solid设计原则介绍: Robert C. Martin定义了五项面向对象的设计原则: 小号英格尔-责任原则 笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则,并 d ependency倒置原则 这些一起被普遍称为SOLID原则。 在设计面向对象的系统时&a…

nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性

关系型数据库的局限NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战:1、高并发一个最典型的就是电商网站,例如双11,几亿大军的…

二叉树的先中后序遍历

【0】README 0.1)本文旨在理清二叉树的先中后序遍历, 以及如何建立二叉树等相关内容; 0.2)本文涉及代码均为原创; 0.3)本文中遍历后的打印结果,朋友您可以直接写出二叉树的节点构造出来&…

表达式树

【0】README 0.1)本文旨在总结出表达式树的构建步骤, 其中还涉及到中缀转后缀表达式,以及如何计算 表达式树中的值; 0.2)本文源代码均为原创; 0.3) 其实, 实现一个简单的计算器&a…

Date/Timestamp/String/LocalDate/LocalDateTime

文章目录String 转成 DateDate 转成 StringString 转成 Timestamp获取系统当前的毫秒数获取系统当前的日期时间毫秒数转成 Timestamp毫秒数转成 DateTimestamp 转成 StringDate 转成 TimestampTimestamp 转成 Datejava.util.Date 转成 java.sql.Date将带T的日期时间转成正常的日…

python可以用来写什么工具_python写工具

谷歌开源 Python Fire:可自动生成命令行接口今天我们很高兴地宣布 Python Fire 开源。Python Fire 可从任何 Python 代码生成命令行接口(command line interfaces (CLIs)),简单地调用任意 Python 程序中的 Fire 函数以将那个程序自动地转化为 CLI。该库可…

java原始类型和引用类型_Java中的8种原始类型

java原始类型和引用类型几年前,当我开始编辑Java Basics系列时,我认为将一些非常详细的信息拉到自己的帖子中是很有意义的。 这样,初学者的内容就更容易消化了。 首先,我将介绍有关Java的8种原始类型的所有信息。 Java基本类型 正…

androidtabhost缓存_FragmentTabHost布局的使用及优化方式

欢迎Follow我的GitHub, 关注我的简书. 其余参考Android目录.TabHostAndroidFragmentTabHost作为Android4.0版本的控件, 已经被项目广泛使用, 5.0版本又推出TabLayoutViewPager显示多页. 我来讲解如何使用FragmentTabHost.本文源码的GitHub下载地址主要包括:(1) 自定义Tab的图片…

二叉查找树

【0】README 0.1)本文的重点在于介绍 二叉查找树的概念,以及写出 二叉查找树的操作例程的源代码, 其中当属delete 操作的源代码最不容易实现; 0.2)本文源代码均为原创, 当然 代码中的idea 是借鉴人家的&a…

常用的命名规范/命名规则

文章目录骆驼式命名法(CamelCase)帕斯卡命名法(PascalCase)串式命名法(KebabCase)下划线命名法(UnderScoreCase)骆驼式命名法(CamelCase) 也叫小驼峰式命名法…

spring order_Spring @Order批注

spring order介绍: Spring Order注释是在Spring 2.0中首次引入的。 然后,它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面,对该注释的实现进行了进一步改进。 从那时起,它还支持对Java数组或List之类的集合中的Spring组件或…

AVL树

【0】README 0.1)本文给出了平衡二叉树(AVL树)的插入例程涉及到的单旋转双旋转的概念,并给出了代码实现; 0.2)本文源代码均为原创, 当然相关idea 还是借鉴人家的;(真心…

spring 注释_Spring@懒惰注释

spring 注释介绍: 默认情况下, Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中,我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&…