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://<user>:<password>@<host>[:<port>]/<dbname> pymysql:mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector:mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> 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的方式

 

转载来自:
作者:小蜗牛的成长
链接:https://www.jianshu.com/p/84986de8a903
来源:简书

python ORM框架:SqlAlchemy的更多相关文章

  1. Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...

  2. Python ORM框架之SQLAlchemy

    前言: Django的ORM虽然强大,但是毕竟局限在Django,而SQLAlchemy是Python中的ORM框架: SQLAlchemy的作用是:类/对象--->SQL语句--->通过 ...

  3. python(十二)下:ORM框架SQLAlchemy使用学习

    此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...

  4. python的ORM框架SQLAlchemy

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业  一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...

  5. python、第七篇:ORM框架SQLAlchemy

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

  6. 【Python】ORM框架SQLAlchemy的使用

    ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...

  7. ORM框架SQLAlchemy与权限管理系统的数据库设计

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

  8. MySQL之ORM框架SQLAlchemy

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

  9. ORM框架SQLAlchemy

    SQLAlchemy orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是类似python这种面向对象的程序来说一切皆对象,但是使用的数据库却都是关系型 ...

随机推荐

  1. 阿里云 Server (Ubuntu 12.04) 配置 FTP

    来自 http://blog.csdn.net/zgrjkflmkyc/article/details/45510345 这个是阿里云的官方用户手册  http://bbs.aliyun.com/re ...

  2. Ubuntu下安装nfs,Windows下访问

    Linux 下: 1. 在终端输入  sudo apt-get install portmap nfs-common nfs-kernel-server 2.建立客户机访问目录  sudo mkdir ...

  3. 网址URL知识

    URL由三部分组成:资源类型.存放资源的主机域名.资源文件名. URL的一般语法格式为: (带方括号[]的为可选项): protocol :// hostname[:port] / path / [; ...

  4. SSH连接时,长时间不操作就断开的解觉办法

    1.第一次尝试失败 修改/etc/ssh/sshd_config文件, 找到 ClientAliveInterval 0 ClientAliveCountMax 3 并将注释符号("#&qu ...

  5. Java标识符&关键字

    1. 标识符&关键字 [标识符]: Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符. 凡是自己可以起名字的地方都叫标识符 命名规则:(一定要遵守,不遵守就会报编译的错误) ...

  6. MySQL主键跟外键

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄. 身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证 ...

  7. 最佳实践:阿里云VPC、ECS支持IPv6啦!

    12月6日,阿里云宣布为企业提供全栈IPv6解决方案. 阿里云专有网络VPC.云服务器ECS,作为阿里云的核心产品,也于2018年11月底上线双栈VPC.双栈ECS,目前正在对外公测中. 那么如何在阿 ...

  8. thinkphp 应用模式

    应用模式提供了对核心框架进行改造的机会,可以让你的应用适应更多的环境和不同的要求. 每个应用模式有自己的模式定义文件,用于配置当前模式需要加载的核心文件和配置文件,以及别名定义.行为扩展定义等等.根据 ...

  9. NOIp2018集训test-9-4

    老张让我们2.5h考NOI%你题,喵喵喵? 因为今(我)天(实)的(在)题(太)鬼(弱)畜(了)了,我还只改了t1. Problem A. reorder 考试的时候大家都写了最长不降子序列,然后全员 ...

  10. NX二次开发-UFUN获取工程图的数量和tag UF_DRAW_ask_drawings

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> #include < ...