SQLAlchemy简介
SQLAlchemy简介
SQLAlchemy是Python SQL工具包和对象关系映射器,是python中最著名的ORM(Object Relationship Mapping)框架,它简化了应用程序开发人员在原生SQL上的操作,使开发人员将主要精力都放在程序逻辑上,从而提高开发效率。它提供了一整套著名的企业级持久性模式,设计用于高效和高性能的数据库访问。
使用ORM操作数据库:
优势 :代码易读,隐藏底层原生SQL语句,提高了开发效率。
劣势 :执行效率低 ,将方法转换为原生SQL后 原生SQL不一定是最优的。
环境:
centos 7 x64 python 3.6 SQLAlchemy 1.3.16 pymysql 0.9.3 mariadb 5.5.64
关于如何安装上述环境,这里不做演示,相信大家能搜到这篇文章,想必这种小问题不在话下。
连接数据库
sqlalchemy.create_engine(*args, **kwargs):简介
sqlalchemy支持的数据库:
- PostgreSQL
 - MySQL
 - Oracle
 - SQL Server
 - SQLite
 
sqlalchemy.create_engine(*args, **kwargs):创建数据库实例。
常用参数:
Engine:用URL的方式填写连接数据库所需的数据。如下格式:
db = create_engine('mysql+pymysql://数据库用户:数据库密码@127.0.0.1:3306/数据库名?charset=utf8') 
case_sensitive=True:如果为False,在查询获取列名时将不区分大小写。
connect_args:值是一个字典,用于设置数据库连接参数,连接数据库时可以传递自定义参数。如下将连接信息存放到字典中。
# 将连接信息放到connect_args字典中
db = create_engine('mysql+pymysql://', connect_args={'user': '用户名',
'password': '密码',
'host': '数据库地址',
'port': 3306,
'database': '数据库',
'charset': 'utf8'})
creator:值是函数名,该函数返回数据库连接对象。如下:
from sqlalchemy import create_engine
import pymysql
# 使用pymysql获取连接对象
def connect_sql():
connect = pymysql.connect(
host='数据库地址',
user='用户名',
password='密码',
db='数据库',
charset='utf8',
)
return connect
# 获取数据库实例
db = create_engine('mysql+pymysql://',creator=connect_sql)
echo=False:如果为True会将执行的SQL语句及引擎执行的过程写到默认的日志当中,默认日志使用sys.stdout作为输出。echo的值除了True|False还可以设置为'debug'等字符串的形式来调整日志等级。如下:
# 设置日志等级
db = create_engine('mysql+pymysql://', connect_args={'user': '用户名',
'password': '密码',
'host': '数据库地址',
'port': 3306,
'database': '数据库',
'charset': 'utf8'},echo='debug')
echo_pool=False:如果为True将会记录连接池的迁入与迁出,默认日志使用sys.stdout作为输出,echo_pool的值除了True|False还可以设置为'debug'等字符串的形式来调整日志等级。
encoding:SQLAlchemy对从数据库中获取的数据编码|解码方式,默认是utf-8。
isolation_level:数据库事物隔离,值是:"SERIALIZABLE"、 "REPEATABLE_READ"、 "READ_COMMITTED"、"READ_UNCOMMITTED" 、"AUTOCOMMIT".,具体以后端使用的数据库为准。
logging_name:sqlalchemy.engine记录器中生成的日志记录的“name”字段,默认为对象id的十六进制字符串。
max_identifier_length:值是一个整数,用于设置SQL标识符(如表名、列名或标签名)的最大字符数。
max_overflow=10:允许连接池内“溢出”的连接数,即在池大小设置之外打开的连接数。这只用于QueuePool。
module=None :对Python模块对象(模块本身,而不是其字符串名称)的引用,如mysql使用pymysql驱动,此参数将绕过导入,而使用给定的模块,直接操作数据库。可用于测试DBAPI以及将“模拟”DBAPI实现注入引擎。
pool=None:如果值不是None,则是pool的实例或者QueuePool 的实例,此时将绕过URL参数中的连接参数,使用给定的pool或QueuePool作为engine的基础连接池。所谓pool池其实就是指数据库连接实例。
pool_size=5:连接池中保持打开状态的连接数,池大小设置为0表示没有限制,禁用池,将poolclass设置为NullPool。
poolclass=None:用户自定义连接池。
pool_recycle=-1 :在给定的秒数之后回收连接。默认为-1表示没有超时。例如,设置为3600意味着连接将在一小时内连接上如果没有任何活动将被回收。注意,如果在八小时内未在连接上检测到任何活动,MySQL将自动断开连接(尽管这可以通过MySQLDB连接本身和服务器配置进行配置)。
pool_reset_on_return='rollback':设置底层池对象的Pool.reset_on_return参数,该参数可以设置为值“rollback”、“commit”或“None”。
pool_timeout=30:获取连接池的超时时间单位是秒。
pool_use_lifo=False:从队列池检索连接时使用后进先出,而不是先进先出。使用后进先出,服务器端超时方案可以减少在非高峰使用期间使用的连接数。在计划服务器端超时时,请确保使用了回收或预ping策略来优雅地处理过时的连接。
plugins:要加载的插件名称的字符串列表。
SQLAlchemy简单示例
1、准备数据库sql_test
MariaDB [(none)]> create database sql_test;
2、连接sql_test数据库,获取数据库实例
from sqlalchemy import create_engine
import pymysql
# 第一种获取数据库实例的方法
def connect_sql():
# 使用pymysql获取连接对象
connect = pymysql.connect(
host='数据库地址',
user='用户名',
password='密码',
db='数据库',
charset='utf8',
)
return connect
# 获取数据库实例
db = create_engine('mysql+pymysql://',creator=connect_sql) # 第二种获取数据库实例的方法
db = create_engine('mysql+pymysql://', connect_args={'user': '用户名',
'password': '密码',
'host': '数据库地址',
'port': 3306,
'database': '数据库',
'charset': 'utf8'}) # 第三种获取数据库实例的方法
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8')
3、在数据库中创建表
在创建表时由于是使用的ORM,所以需要将创建好的类与SQLAlchemy底层建表的类进行映射,类似于Django中类要继承model类一样。
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
# 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8') # 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(Integer) # 创建表
Base.metadata.create_all(db)
运行上面的代码后会在数据库sql_test中创建一个名为users的表。

创建多个表只需要创建多个类即可,如下:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
# 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8') # 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(Integer) class Table_1(Base):
__tablename__ = 'table_1' # 设置表明 id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(Integer) class Table_2(Base):
__tablename__ = 'table_2' # 设置表明 id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(Integer) # 创建表
Base.metadata.create_all(db)
最终你会看到如下:

4、向表中添加数据。
以上面创建好的users表为示例:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8') # 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer,primary_key=True)
name = Column(String(32))
age = Column(Integer) # 向表中添加记录
obj = User(name='小明',age=12)
# 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 向表中添加数据,此时数据保存在内存中
db_session.add(obj)
# 提交数据,将数据保存到数据库中
db_session.commit()
# 关闭会话
db_session.close()
如果一切顺利你会看到:

4.1向表中添加多条数据。
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8') # 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer, primary_key=True)
name = Column(String(32))
age = Column(Integer)
# 插入多条记录
obj = [User(name='小丽', age=12),
User(name='李红', age=14),
User(name='小刚', age=10)]
# 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 向表中添加数据,此时数据保存在内存中
db_session.add_all(obj)
# 提交数据,将数据保存到数据库中
db_session.commit()
# 关闭会话
db_session.close()
如果成功会看到如下:

5、查询表中数据
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8')
# 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer, primary_key=True)
name = Column(String(32))
age = Column(Integer) # 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 查询表中所有数据
all_list = db_session.query(User).all()
for obj in all_list:
print(obj.id,obj.name,obj.age)
# 关闭会话
db_session.close()
如果表中有数据,你会看到如下:

6、使用filter过滤查询条件
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8')
# 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer, primary_key=True)
name = Column(String(32))
age = Column(Integer) # 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 使用filter过滤查询条件
all_list = db_session.query(User).filter(User.name=='小明')
for obj in all_list:
print(obj.id,obj.name,obj.age)
# 查看SQLAlchemy底层执行的sql语句
print(f'执行的sql语句:{all_list}')
# 关闭会话
db_session.close()
打印结果如下:

7、 修改数据
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8')
# 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer, primary_key=True)
name = Column(String(32))
age = Column(Integer) # 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 将小明的名字修改为娃哈哈
all_list = db_session.query(User).filter(User.name=='小明').update({'name':'娃哈哈'})
# 提交数据,将数据保存到数据库中
db_session.commit()
# 查看更改后的表
all_data = db_session.query(User).all()
for obj in all_data:
print(obj.id,obj.name,obj.age)
# 关闭会话
db_session.close()
执行完成后你会看到如下:

8、删除数据
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 获取数据库实例
db = create_engine('mysql+pymysql://数据库用户:数据库密码@数据库地址:3306/数据库名?charset=utf8')
# 建立映射关系
Base = declarative_base()
class User(Base):
__tablename__ = 'users' # 设置表明 id = Column(Integer, primary_key=True)
name = Column(String(32))
age = Column(Integer) # 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 删除id是1的行
all_list = db_session.query(User).filter(User.id==1).delete()
# 提交数据,将数据保存到数据库中
db_session.commit()
# 删除后查看表中数据
all_data = db_session.query(User).all()
for obj in all_data:
print(obj.id,obj.name,obj.age)
# 关闭会话
db_session.close()
执行完成后,打印结果如下:

好了关于SQLAlchemy的增、删、改、查先简单介绍这里,关于SQLAlchemy的一些高级操作待更新。。。。。
SQLAlchemy简介的更多相关文章
- sqlalchemy 简介
		
#! /usr/bin/env python3 # -*- coding:utf-8 -*- #use SQLAlchemy #ORM:Object-Relational Mapping ,把关系数据 ...
 - ORM SQLAlchemy 简介
		
对象关系映射(Object Relational Mapping,简称ORM使用DB-API访问数据库,需要懂 SQL 语言,能够写 SQL 语句,如果不想懂 SQL,又想使用关系型数据库,可以使用 ...
 - python数据库操作之pymysql模块和sqlalchemy模块(项目必备)
		
pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 1.下载安装 pip3 install pymysql 2.操作数据库 (1).执行sql #! ...
 - SQLAlchemy 教程 —— 基础入门篇
		
SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...
 - Flask简介,安装,demo,快速入门
		
1.Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug ...
 - Python SQLAlchemy 模块
		
SQLAlchemy 简介: SQLAlchemy 是用于实现 ORM(Object Relational Mapping,对象关系映射)的一个模块,即把数据库的表结构映射到对象上在 Python 中 ...
 - SQLAlchemy和Flask-SQLAlchemy
		
一.ORM 与 SQLAlchemy 简介 ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对 ...
 - SQLAlchemy 简单笔记
		
ORM 江湖##### 曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函 ...
 - 偏于SQL语句的 sqlAlchemy 增删改查操作
		
ORM 江湖 曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函数存储过程 ...
 
随机推荐
- Unity---DOTween插件学习(4)---Andy老师自己写的动态效果工具插件
			
本文及系列参考于Andy老师的DOTween系列 欢迎大家关注Andy老师 13.动态效果工具插件 这个插件是Andy老师自己利用DOTween写的按钮点击和显示的效果控件,有非常多的种类,还是挺好用 ...
 - 关于双端队列 deque 模板  && 滑动窗口 (自出)
			
嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...
 - github:当你想要使用VSCODE开心提交代码时,出现Git:git@github.com:Permission denied(publickey)解决方案
			
当你想要使用VSCODE开心提交代码时,出现Git:git@github.com:Permission denied(publickey)弹框 图片: 原因:电脑公钥(publickey)未添加至gi ...
 - Docker基础 :网络配置详解
			
本篇文章将讲述 Docker 的网络功能,包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信,有兴趣的可以了解下. 大量的互联网应用服务包含多个 ...
 - Java文件与io——字节数组流数据流字符串流
			
字节数组流 ByteArrayInputStream:包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪read方法要提供的下一个字节.关闭ByteArrayInputStream无效. ...
 - 机器学习框架ML.NET学习笔记【2】入门之二元分类
			
一.准备样本 接上一篇文章提到的问题:根据一个人的身高.体重来判断一个人的身材是否很好.但我手上没有样本数据,只能伪造一批数据了,伪造的数据比较标准,用来学习还是蛮合适的. 下面是我用来伪造数据的代码 ...
 - Java编程中中文乱码问题的研究及解决方案
			
0 引言 Java最大的特性是与平台的无关性及开发环境的多样性.字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码.Java语言内部采用Unicode编码,它是定长双字节编码,即任何符 ...
 - SpringBoot | 第十三章:测试相关(单元测试、性能测试)
			
前言 前面写了这么多章节,都是通过浏览器访问的形式,进行接口方法访问进而验证方法的正确与否.显然在服务或者接口比较少时,这么做没有啥问题,但一旦一个项目稍微复杂或者接口方法比较多时,这么验证就有点不符 ...
 - 属性(property)与成员变量(ivar)
			
类内使用成员变量{}, 类外使用属性@property /*********** --- Person.h */ @interface Person : NSObject { NSString *_n ...
 - jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别讲解
			
1.(function($){...})(jQuery); (1).原理: 这实际上是匿名函数,如下: function(arg){...} 这就定义了一个匿名函数,参数为arg:而调用函 ...