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 ...
随机推荐
- python 调用麦克风;摄像头;截屏;
# -*- coding: utf-8 -*- """ Created on Mon Jun 24 14:47:35 2019 @author: erio "& ...
- 洛谷p1886滑动窗口最大最小值 双单调队列
#include <iostream> #include <cstdio> using namespace std; int n,k,a[1000007],q1[2000007 ...
- springboot使用RestTemplate+httpclient连接池发送http消息
简介 RestTemplate是spring支持的一个请求http rest服务的模板对象,性质上有点像jdbcTemplate RestTemplate底层还是使用的httpclient(org.a ...
- go modules——HelloWorld示例
go modules--HelloWorld示例 go modules 存在的意义是方便代码的共享(虽然这会使自己开发过程中有一些小小的麻烦) 开发第一步,创建一个github仓库,然后克隆到本地 首 ...
- PEP 8 & Style Guide
PEP 8 & Style Guide Style Guide for Python Code https://www.python.org/dev/peps/pep-0008/ PEP Py ...
- queueMicrotask & microtask
queueMicrotask & microtask microtask microtask queue Promise Mutation Observer API MutationObser ...
- flutter 让app跟随系统的theme
首先你需要在"MaterialApp"设置两套theme MaterialApp( theme: myTheme, // light darkTheme: ThemeData.da ...
- nasm astrspn函数 x86
xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...
- nasm aat函数 x86
xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain dllmain: ...
- 对DevOps的九大误解,是时候纠正了!
DevOps是开发和运维的结合,有助于集成和自动化测试过程以及部署存储库,还提供了透明度以及灵活性.DevOps的目标如下: ●更快的上市时间(TTM). ●减少各种修复之间的前置时间.●提高部署频率 ...