前沿
对象关系映射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的更多相关文章

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

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

  2. python ORM模块sqlalchemy的使用

    1.安装sqlalchemy pip install sqlalchemy 2.导入必要的包及模块 import sqlalchemy from sqlalchemy.ext.declarative ...

  3. python连接数据库使用SQLAlchemy

    参考python核心编程 ORM(Object Relational Mapper),如果你是一个更愿意操作Python对象而不是SQL查询的程序员,并且仍然希望使用关系型数据库作为你的后端,那么你可 ...

  4. Django和SQLAlchemy,哪个Python ORM更好?

    ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...

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

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

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

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

  7. python的ORM框架SQLAlchemy

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

  8. Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块

    ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...

  9. Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例

    sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...

随机推荐

  1. zzuli-2266 number

    题目描述 某人刚学习了数位DP,他在某天忽然思考如下问题: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9]的数码种类相同 ...

  2. USB2.0协议学习笔记---基本概念

    概念  USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...

  3. vuepress & ReferenceError: window is not defined

    vuepress & ReferenceError: window is not defined bug Client Compiled successfully in 15.35s Serv ...

  4. GitHub new features 2020 All In One

    GitHub new features 2020 All In One Discussions Discussions is the space for your community to have ...

  5. Django : Security in Django

    Security in Django https://docs.djangoproject.com/en/1.10/topics/security/ 1 Cross site scripting (X ...

  6. Android Jetpack All In One

    Android Jetpack All In One 在2018年,我们推出了Android Jetpack作为一组库,以帮助开发人员遵循最佳实践,减少样板代码以及编写可在Android版本和设备之间 ...

  7. Axios all in one

    Axios all in one https://github.com/axios/axios#example GET const axios = require('axios'); // Make ...

  8. script async / defer

    script async / defer preload / prefetch https://abc.xgqfrms.xyz/ https://javascript.info/script-asyn ...

  9. 超强嘉宾阵容——NGK Global启动大会圆满举办

    近日,由星盟全球投资公司.灵石团队联合主办的NGK Global全球生态启动大会圆满开幕.大会汇集区块链领域.金融领域.密码学领域.智能算法领域等众多大咖,和NGK Global全球价值共识者共聚一堂 ...

  10. git log的常用命令

    git config --global alias.lg "log --graph --oneline --pretty='%Cred%h%Creset -%C(yellow)%d%Cblu ...