ORM、SQLAchemy

orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是类似python这种面向对象的程序来说一切皆对象,但是使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作:

1
2
3
4
5
6
7
8
9
10
11
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...]

更多数据库ORM链接方式资料:查看

1、安装

1
pip3 install SQLAlchemy

2、创建sql表

2.1、原本创建sql表命令

CREATE TABLE user (

    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(32),
    password VARCHAR(64),
    PRIMARY KEY (id)
)

2.2、使用sqlalchemy创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
 
 
connect = create_engine("mysql+pymysql://root:123456@localhost:3306/mysql",
                        encoding="utf-8",
                        echo=True)  # 连接数据库,echo=True =>把所有的信息都打印出来
 
 
Base = declarative_base()  # 生成ORM基类
 
 
class User(Base):
    __tablename__ = "hello_word"  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))
 
Base.metadata.create_all(connect)   # 创建表结构

2.3、sqlaicheym原始创建表的方式(2.2创建表的方式就是基于2.3的再封装,所以2.3基本这种方式基本不使用)

from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey

from sqlalchemy.orm import mapper
  
metadata = MetaData()
  
# 表结构
user = Table('user', metadata,
            Column('id', Integer, primary_key=True),
            Column('name', String(50)),
            Column('fullname', String(50)),
            Column('password', String(12))
        )
  
class User(object):
# User类的静态变量
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password
  
mapper(User, user) # mapper 函数使表结构和User类的静态变量关联起来

最基本的表建立好了之后,再建立与数据的Session会话连接,就可以进行增删查改等操作:

1
2
session_class = sessionmaker(bind=connect)  # 创建与数据库的会话session class ,这里返回给session的是个class,不是实例
session = session_class()   # 生成session实例

3、增

1
2
3
4
5
6
7
8
9
10
11
12
#新增一条数据
#原生sql:insert  into mysql.hello_word(name,password) values("test2","1234");
obj = User(name="test", password="1234")  #生成你要创建的数据对象
session.add(obj) #把要创建的数据对象添加到这个session里, 一会统一创建
session.commit() #统一提交,创建数据,在此之前数据库是不会有新增数据的
 
#新增多条数据
#原生sql:insert  into mysql.hello_word(name,password) values("test2","1234"),("test3","123");
obj = User(name="test", password="1234")
obj1 = User(name="test", password="1234")
session.add_all([obj,obj1])
session.commit()<br><br>#回滚,在session.add()之后,在session.commit()之前,想把添加至session缓存中的数据清除,使用rollback()函数回滚即可<br>Session.rollback()
1
 

4、删

1
2
3
#原生sql:mysql.hello_word where id > 5;
session.query(User).filter(User.id 5).delete() #通过session查询User类,然后过滤出id>5的进行删除
session.commit() #提交

5、改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#①第一种方式
data = Session.query(User).filter_by(name="test1").first()  #获取数据
data.name = "test"  #修改数据
Session.commit()   #提交
 
#②第二种方式,通过查找表,过滤条件,然后更新对应参数
session.query(User).filter(User.id 15).update({"name""test"})
session.query(User).filter(User.id == 18).update({User.name: "hello"}, synchronize_session=False)
session.query(User).filter_by(name="test1").update({User.password: User.name}, synchronize_session="evaluate")
session.commit()
 
#③synchronize_session解释,用于query在进行delete or update操作时,对session的同步策略:
#1、synchronize_session=False,不对session进行同步,直接进行delete or update操作。
#2、synchronize_session="evaluate",在delete or update操作之前,用query中的条件直接对session的identity_map中的objects进行eval操作,将符合条件的记录下来, 在delete or update操作之后,将符合条件的记录删除或更新。

6、查

6.1、几种查询方式的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#原生sql:select * from mysql.hello_word;
ret = session.query(User).all()  #查询所有
#也可以这样写:
ret = Session.query(User.name,User.id).all()
 
#原生slq:select name,password from mysql.hello_word;
ret = session.query(User.name, User.extra).all()  #只查询name和extra字段所以所有数据
 
#原生sql:select * from mysql.hello_word where name="test1";
ret = session.query(User).filter_by(name='test1').all() #查询name='alex'的所有数据
ret = session.query(User).filter_by(name='test1').first()#查询name='alex'的第一条数据
 
#查询id>5的name字段内容,且以id大小排序
#原生sql;select name from mysql.hello_word where id >5 order by id;
ret = session.query(User).filter(text("id>:value and name=:name")).params(value=5, name='test2').order_by(User.id).all()
 
#根据原生sql查询数据
ret = session.query(User).from_statement(text("SELECT * FROM hello_word where name=:name")).params(name='test1').all()

6.2、filter和filter_by使用的区别

1
2
3
4
#filter用于sql表达式查询过滤,如>,<, ==,等表达式
session.query(MyClass).filter(MyClass.name == 'some name')
#filter_by用于关键字查询过滤,如id=value,name=value
session.query(MyClass).filter_by(name = 'some name')

6.3、重构__repr__方法,将5.1 中ret内存对象按__repr__方法中定义的格式进行打印显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class User(Base):
    __tablename__ = "hello_word"  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))
 
    def __repr__(self):    # 使返回的内存对象变的可读
        return "<id:{0} name:{1} password:{2}>".format(self.idself.name, self.password)
 
#Base.metadata.create_all(connect)  # 创建标结构
 
session_class = sessionmaker(bind=connect)  # 创建与数据库的会话session class ,这里返回给session的是个class,不是实例
session = session_class()   # 生成session实例
 
user = session.query(User).all()  #查询全部
print(user)
 
#输出
[<id:1 name:test1 password:1234>, <id:2 name:test1 password:1234>, <id:8 name:test2 password:1234>, <id:9 name:test3 password:123>, <id:10 name:test4 password:123>, <id:11 name:test5 password:123>, <id:12 name:test2 password:1234>, <id:13 name:test3 password:123>, <id:14 name:test4 password:123>, <id:15 name:test5 password:123>, <id:16 name:test2 password:1234>, <id:17 name:test3 password:123>, <id:18 name:test4 password:123>, <id:19 name:test5 password:123>]

7、其他操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#多条件查询
#原生sql:select * from mysql.hello_word where id >2 and id < 19
data = session.query(User).filter(Use.id>2).filter(Use.id<19).all()
 
<br>#通配符
#原生sql:select * from mysql.hello_word where name like "test%" #"test_"、%test%
data = session.query(User).filter(User.name.like('test%')).all() #匹配以test开头,而后跟多个字符
data = session.query(User).filter(User.name.like('test_')).all() #匹配以test开头,而后跟一个字符
data = session.query(User).filter(~User.name.like('e%')).all() #加~后,忽略like(),直接匹配所有
#原生sql select count(name) from mysql.hello_word where name like "%test%"
data = session.query(User).filter(User.name.like("%qigao%")).count() # 模糊匹配并计数
<br>
#分组
from sqlalchemy import func #导入func 进行函数操作
#原生sql:select count(name),name from mysql.hello_word group by name
data =session.query(func.count(User.name),User.name).group_by(User.name).all()  #根据User.name分组
#原生sql:select max(id),sum(id),min(id) from mysql.hello_word group by name  #根据name 分组
data =session.query(func.max(User.id),func.sum(User.id),func.min(User.id)).group_by(User.name).all()
#原生sql:select max(id),sum(id),min(id) from mysql.hello_word group by name having min(id > 2) # 根据name分组且id>2
data = session.query(func.max(User.id),func.sum(User.id),func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()
<br><br>#排序
#原生sql:select * from mysql.hello_word  order by id asc
data = session.query(User).order_by(User.id.asc()).all() #将所有数据根据 “列” 从小到大排列
#原生sql:select * from mysql.hello_word  order by id desc, id asc
data = session.query(User).order_by(User.id.desc(), User.id.asc()).all()#将所有数据根据 “列1” 从大到小排列,如果相同则按照“列2”由小到大排列
 
 
#条件表达式 in、between、 and 、or
data = session.query(User).filter_by(name='test').all()
data = session.query(User).filter(User.id 1, Users.name == 'test').all()
data = session.query(User).filter(User.id.between(13), Users.name == 'test').all()
data = session.query(User).filter(User.id.in_([1,3,4])).all()
data = session.query(User).filter(~User.id.in_([1,3,4])).all()
data = session.query(User).filter(Users.id.in_(session.query(User.id).filter_by(name='test'))).all()
 
from sqlalchemy import and_, or_
data = session.query(User).filter(and_(User.id 3, Users.name == 'test')).all()
data = session.query(User).filter(or_(User.id 2, Users.name == 'test')).all()
data = session.query(User).filter(or_(User.id 2,and_(User.name == 'test',User.id 3),User.password != "")).all()

  

  

ORM、SQLAchemy的更多相关文章

  1. Python自动化运维之18、Python操作 MySQL、pymysql、SQLAchemy

    一.MySQL 1.概述 什么是数据库 ? 答:数据的仓库,和Excel表中的行和列是差不多的,只是有各种约束和不同数据类型的表格 什么是 MySQL.Oracle.SQLite.Access.MS ...

  2. 深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念

    本篇文章是对单一入口.MVC.ORM.CURD.ActiveRecord概念进行了详细的分析介绍,需要的朋友参考下     MVC MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使 ...

  3. JdbcTemplate 、Mybatis、ORM 、Druid 、HikariCP 、Hibernate是什么?它们有什么关系?

    JdbcTemplate .Mybatis.ORM .Druid .HikariCP .Hibernate是什么?它们有什么关系? 学完Spring和SpringMVC之后,就急于求成的开始学习起Sp ...

  4. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

  5. ORM框架-SQLAchemy使用

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

  6. Django ORM、一对一、一对多、多对多、详解

    上篇博客也提到这些知识点,可能大家还是不太清楚,这篇博客为大家详细讲解ORM中的几个知识点 1.1首先我们先看一个小案例: #_*_coding:utf-8_*_ from django.db imp ...

  7. DAL、DAO、ORM、Active Record辨析

    转自:http://blog.csdn.net/suiye/article/details/7824943 模型 Model 模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑).一开始我 ...

  8. MVC、ORM、CURD、ActiveRecord、单一入口的概念

    MVC MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC应用程序被分成三个核心部件:模型(M).视图(V).控制器(C),它们各自处理自己的任务. 视图 :视图是用户看到并 ...

  9. 轻量级.NET ORM、高性能.NET ORM 之 SqlSugar 开源ORM - ASP.NET

    3.0最新API: http://www.cnblogs.com/sunkaixuan/p/5911334.html 1.前言/Preface SqlSugar从去年到现在已经一年了,版本从1.0升到 ...

随机推荐

  1. Gitlab备份与恢复、迁移与升级

    0.Gitlab安装 1.安装和配置必要的依赖关系 在CentOS7,下面的命令将在系统防火墙打开HTTP和SSH访问.   yum install curl openssh-server postf ...

  2. 商品和订单中使用MQ

    一.将Product服务增加到配置中心 1.添加引用 <dependency> <groupId>org.springframework.cloud</groupId&g ...

  3. Spring AOP + PageHelper分页

    1.增加依赖配置 <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweav ...

  4. Kafka三款监控工具比较

    在之前的博客中,介绍了Kafka Web Console这个监控工具,在生产环境中使用,运行一段时间后,发现该工具会和Kafka生产者.消费者.ZooKeeper建立大量连接,从而导致网络阻塞.并且这 ...

  5. Spring Cloud(Dalston.SR5)--Eureka 注册中心高可用搭建

    高可用集群 在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对与微服务和服务注册中心都需要高可用部署,Eureka 高可用实际上就是将自己 ...

  6. 记一次shell脚本编写及执行

    首先cd进一个目录下 tauch tset.sh //新建一个test.sh文件 vim test.sh 编辑脚本 i 插入 #!/bin/bash data 按Esc键 再按ctrl+: wq + ...

  7. 电信版华为MATE7 EMUI4.0回退3.1和3.0教程与中转包

    mate7升级6.0后遇到很多问题,想回退版本,找了很多教程,现在总结一下用中转包回退.EMUI4.0回退3.1,先下载B500中转包,将dload复制到2G以上内存卡根目录,不要三键强刷,会卡在开机 ...

  8. sqlalchemy操作----建表 插入 查询 删除

    ... #!_*_coding:utf-8_*_ #__author__:"Alex huang" import sqlalchemy from sqlalchemy import ...

  9. 【springboot】之利用shell脚本优雅启动,关闭springboot服务

    springbot开发api接口服务,生产环境中一般都是运行独立的jar,在部署过程中涉及到服务的优雅启动,关闭, springboot官方文档给出的有两种方式, 1.使用http shutdown ...

  10. LeetCode——15. 3Sum

    一.题目链接:https://leetcode.com/problems/3sum/ 二.题目大意: 3和问题是一个比较经典的问题,它可以看做是由2和问题(见http://www.cnblogs.co ...