python ORM之sqlalchemy
前沿
对象关系映射ORM是在实际应用编程中常用到的技术,它在对象和关系之间建立了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。简单来说就是开发人员在使用ORM模型编程时,不需要再编写SQL语句来操作数据库,而是使用一系列的函数和方法来完成对数据库的操作。
Python目前比较流行的ORM框架主要是SQLAlchemy框架,它可以兼容MySQL、SQLite、Oracle等多种关系型数据库。
准备工作
安装SQLAlchemy框架
pip3 install sqlalchemy
连接数据库
SqlAlchemy模块在连接数据库时需要指定一个连接URI,用于指明数据库的类型以及账号密码等参数,其格式为:
(1)MySQL数据库
mysql+frameworkname://username:password@address:port/databasename
参数解释:
frameworkname:连接数据库使用的模块名,本节使用的是PyMySQL;
username:数据库用户名;
password:连接密码;
address:连接地址;
port:端口;
databasename:数据库名。
(2)SQLite数据库
#Unix/Mac系统
sqlite:////absolutepath/dbname.db
#Windows系统
sqlite:///C:\\absolutepath\\dbname.db
参数解释:
absolutepath:绝对路径;
dbname:数据库文件名。
示例
# connect_orm.py
from sqlalchemy import create_engine
try:
# 连接MySQL数据库,地址:localhost:3306,账号:root,密码:123,数据库:test
MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
print('连接MySQL数据库成功', MySQLEngine)
# 连接SQLite数据库,如果当前目录不存在test.db文件则会自动生成
SQLiteEngine = create_engine('sqlite:///:test.db', encoding='utf-8')
print('连接SQLite数据库成功', SQLiteEngine)
except Exception as e:
print('连接数据库失败', e)
程序执行的结果为:
连接MySQL数据库成功Engine(mysql+pymysql://root:***@localhost:3306/student?charset=utf8)
连接SQLite数据库成功 Engine(sqlite:///:test.db)
增、删、改、查
1.创建数据库表
待创建的STUDENT表:
列名
类型
备注
SNO
CHAR(10)
NOT NULL
SNAME
CHAR(20)
主键
程序:
# create_table_orm.py
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建基类
BASE = declarative_base()
# 定义学生对象
class Student(BASE):
# 表的名字:STUDENT
__tablename__ = 'STUDENT'
# 学号
sno = Column(String(10))
# 姓名
sname = Column(String(20), primary_key=True)
# 创建表的参数
__table_args__ = {
"mysql_charset": "utf8"
}
try:
# 连接MySQL数据库,地址:localhost:3306,账号:root,密码:123,数据库:test
MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
# 创建STUDENT表
BASE.metadata.create_all(MySQLEngine)
print('创建STUDENT表成功')
except Exception as e:
print("连接SQLite数据库失败", e)
2.插入数据
# insertData_orm.py
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建基类
BASE = declarative_base()
# 定义学生对象
class Student(BASE):
# 表的名字:STUDENT
__tablename__ = 'STUDENT'
# 学号
sno = Column(String(10))
# 姓名
sname = Column(String(20), primary_key=True)
# 创建表的参数
__table_args__ = {
"mysql_charset": "utf8"
}
try:
# 连接MySQL数据库
MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
# 创建MySQL类型
MySQLSession = sessionmaker(bind=MySQLEngine)
# 创建session对象
session = MySQLSession()
# 使用ORM插入数据
# 创建Student对象
Stu = Student(sname='张三', sno='2016081111')
# 将创建的对象添加进session中
session.add(Stu)
# 使用原生SQL插入数据
session.execute(
"INSERT INTO STUDENT VALUES('2016081115','吴芳'),('2016081116','胡月')")
# 提交到数据库
session.commit()
# 关闭session
session.close()
print('插入数据成功')
except Exception as e:
print("连接SQLite数据库失败", e)
3.查询数据
# selectData_orm.py
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建基类
BASE = declarative_base()
# 定义学生对象
class Student(BASE):
# 表的名字:
__tablename__ = 'STUDENT'
sname = Column(String(20), primary_key=True)
sno = Column(String(10))
def __str__(self): # 格式输出查询出的数据
return '%s,%s' % (self.sname, self.sno)
try:
# 连接MySQL数据库
MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
# 创建MySQL类型
MySQLSession = sessionmaker(bind=MySQLEngine)
# 创建session对象
session = MySQLSession()
# 查询学号为2016081111的学生
Stu = session.query(Student).filter(Student.sno == '2016081111')
# 查询所有数据
Stus = session.query(Student).all()
print('查询结果的类型:', type(Stu))
print('STUDENT表所有的数据:')
for row in Stus:
print(row)
# 关闭session
session.close()
except Exception as e:
print("连接SQLite数据库失败", e)
程序执行结果:
查询结果的类型: <class 'sqlalchemy.orm.query.Query'>
STUDENT表所有的数据:
吴芳,2016081115
张三,2016081111
胡月,2016081116
4.修改数据
# selectData_orm.py
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建基类
BASE = declarative_base()
# 定义学生对象
class Student(BASE):
# 表的名字:
__tablename__ = 'STUDENT'
sname = Column(String(20), primary_key=True)
sno = Column(String(10))
def __str__(self): # 格式输出查询出的数据
return '%s,%s' % (self.sname, self.sno)
try:
# 连接MySQL数据库
MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
# 创建MySQL类型
MySQLSession = sessionmaker(bind=MySQLEngine)
# 创建session对象
session = MySQLSession()
# 查询学号为2016081111的学生
Stu = session.query(Student).filter(Student.sno == '2016081111').first()
print('更改前:', Stu)
# 更改姓名为李华
Stu.sname = '李华'
# 提交到数据库
session.commit()
print('更改后:', Stu)
# 关闭session
session.close()
except Exception as e:
print("连接SQLite数据库失败", e)
程序执行结果:
更改前: 张三,2016081111
更改后: 李华,2016081111
5.删除数据
# deleteData_orm.py
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建基类
BASE = declarative_base()
# 定义学生对象
class Student(BASE):
# 表的名字:
__tablename__ = 'STUDENT'
sname = Column(String(20), primary_key=True)
sno = Column(String(10))
def __str__(self): # 格式输出查询出的数据
return '%s,%s' % (self.sname, self.sno)
try:
# 连接MySQL数据库
MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
# 创建MySQL类型
MySQLSession = sessionmaker(bind=MySQLEngine)
# 创建session对象
session = MySQLSession()
# 查询学号为2016081111的学生
before = session.query(Student).filter(Student.sno == '2016081111').first()
print('删除前:', before)
# 删除数据
session.query(Student).filter(Student.sno == '2016081111').delete()
# 提交到数据库
session.commit()
after = session.query(Student).filter(Student.sno == '2016081111').first()
print('删除后:', after)
# 关闭session
session.close()
except Exception as e:
print("连接SQLite数据库失败", e)
程序执行结果:
删除前: 李华,2016081111
删除后: None
python ORM之sqlalchemy的更多相关文章
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- python ORM模块sqlalchemy的使用
1.安装sqlalchemy pip install sqlalchemy 2.导入必要的包及模块 import sqlalchemy from sqlalchemy.ext.declarative ...
- python连接数据库使用SQLAlchemy
参考python核心编程 ORM(Object Relational Mapper),如果你是一个更愿意操作Python对象而不是SQL查询的程序员,并且仍然希望使用关系型数据库作为你的后端,那么你可 ...
- Django和SQLAlchemy,哪个Python ORM更好?
ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...
- python(十二)下:ORM框架SQLAlchemy使用学习
此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...
- 【Python】ORM框架SQLAlchemy的使用
ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...
- python的ORM框架SQLAlchemy
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
随机推荐
- Redis 哨兵高可用(Sentinel)
哨兵机制是 Redis 高可用中重要的一环,其核心是 通过高可用哨兵集群,监控主从复制的健康状态,并实现自动灾备: 哨兵集群以集群的方式进行部署,这种分布式特性具有以下优点: 避免系统中存在单点,防止 ...
- WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
title: WOJ1022 Competition of Programming 贪心 date: 2020-03-19 13:43:00 categories: acm tags: [acm,wo ...
- CodeForces - 803C Maximal GCD 【构造】
You are given positive integer number n. You should create such strictly increasing sequence of k po ...
- 内存耗尽后Redis会发生什么
前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多 ...
- php性能分析利器:xhprof
xhprof是facebook团队开发的用于研究php性能的扩展,并且提供了图形化的界面展示性能参数和过程.对于各种php的项目的性能瓶颈研究有一定帮助,值得一用. 我在上一篇<Dockerfi ...
- vue watch route params change
vue watch route params change watch: { '$route.params.menuKey' (val, oldVal) { console.log('new rout ...
- The best Fibonacci is achieved in js
The best Fibonacci is achieved in js the best realized by using js 斐波那契数列 "use strict"; /* ...
- npm clear folder
npm clear folder rm -rf rimraf rmrf & clear build / dist folder caches https://www.npmjs.com/pac ...
- 十三香 & 香料
十三香 & 香料 十三香原料组成不完全一致, 但有一些香料却是大家都会采用的: 草蔻.砂仁.肉豆蔻.肉桂.丁香. 花椒.大料.小茴香.木香.白芷. 山萘.良姜和姜 王守义十三香 http:// ...
- 转换时间戳,兼容webkit和IE
var date="2018-6-6"; var test=Date.parse(date.replace(/-/g,"/"));console.log(tes ...