前沿
对象关系映射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. VSCode VUE常用配置

    {   // vscode默认启用了根据文件类型自动设置tabsize的选项   "editor.detectIndentation": false,   // 重新设定tabsi ...

  2. JavaScript调试技巧之console.log()

    与alert()函数类似,console.log()也可以接受变量并将其与别的字符串进行拼接: 代码如下: //Use variable var name = "Bob"; con ...

  3. const,volatile,static,typdef,几个关键字辨析和理解

    1.const类型修饰符 const它限定一个变量初始化后就不允许被改变的修饰符.使用const在一定程度上可以提高程序的安全性和可靠性.它即有预编译命令的优点也有预编译没有的优点.const修饰的变 ...

  4. TypeScript Generics All In one

    TypeScript Generics All In one TypeScript 泛型 代码逻辑复用 扩展性 设计模式 方法覆写, 直接覆盖 方法重载,参数个数或参数类型不同 test " ...

  5. URLSearchParams & shape URL params

    URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams var paramsString = ...

  6. YAML & .yml

    YAML & .yml YAML: YAML Ain't Markup Language https://yaml.org/ https://github.com/yaml/www.yaml. ...

  7. calendar time shaper

    calendar time shaper const dateObj = { "id": 191837, "productId": 13602, "a ...

  8. WLAN-AC+AP射频一劳永逸的调优方式

    AP射频调优组网图 射频调优简介 射频调优的主要功能就是动态调整AP的信道和功率,可以使同一AC管理的各AP的信道和功率保持相对平衡,保证AP工作在最佳状态.WLAN网络中,AP的工作状态会受到周围环 ...

  9. C++算法代码——奖学金

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1098 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学 ...

  10. 官网GitLab CI/CD英文文档翻译

    在查阅GitLab官网的CI/CD功能说明时,全是英文看起来不方便,通过翻译软件自动翻译后"内容失真",看起来很变扭.查阅了百度上的资料发现很多翻译很老旧,有些甚至是挂羊头卖狗肉. ...