前沿
对象关系映射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. github 无法访问

    描述: 1. ping 丢失 100% 2. git 失败 Failed to connect to github.com port 443: Timed out 3.打开网站 超时 解决: http ...

  2. Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  3. codevs1169传纸条 不相交路径取最大,四维转三维DP

    这个题一个耿直的思路肯定是先模拟.. 但是我们马上发现这是具有后效性的..也就是一个从(1,1)开始走,一个从(n,m)开始走的话 这样在相同的时间点我们就没法判断两个路径是否是相交的 于是在dp写挂 ...

  4. 【原】无脑操作:Centos 7.6 + MariaDB + Rsyslog + LogAnalyzer环境搭建

    背景: 网络安全法第三章第二十一条明确规定"采取监测.记录网络运行状态.网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月". 为了满足合规性的要求,应当建设相应的日 ...

  5. Virtualbox 安装centos7虚拟机

    Virtualbox 安装centos7虚拟机 一,下载centos7 下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x ...

  6. Apple Screen Recorder All In One

    Apple Screen Recorder All In One Apple macOS 自带录屏 QuickTime Player https://support.apple.com/zh-cn/g ...

  7. ESLint & vue

    ESLint & vue { "name": "app", "version": "1.0.1", " ...

  8. Flutter for Desktop

    Flutter for Desktop https://flutter.dev/desktop https://github.com/flutter/flutter/wiki/Desktop-shel ...

  9. js & touch & pull down & load more

    js & touch & pull down & load more https://www.jianshu.com/p/93597d6bd77d index-list htt ...

  10. PWA & TWA

    PWA & TWA https://www.bilibili.com/video/av68082979/ Service Worker workbox.js https://developer ...