python使用SQLAlchemy操作MySQL


Posted in Python onJanuary 02, 2020

SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一,不亚于Django的ORM框架。

本文将介绍如何使用SQLAlchemy操作MySQL,完成基础的表创建,表格数据的新增、查询、修改、删除(CRUD)等操作。

首先我们需要确认当前的Python环境下已经安装sqlalchemy和pymysql模块。

新建表格

我们使用本地的MySQL数据库,数据库为orm_test。新建一张users表,字段为id,name,age,place。完整的Python代码(create_table.py)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Sanya, Hainan
# time: 12:46

from sqlalchemy.dialects.mysql import INTEGER, VARCHAR
from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()


# users表结构
class Users(Base):
  __tablename__ = 'users'

  id = Column(INTEGER, primary_key=True)
  name = Column(VARCHAR(256), nullable=False)
  age = Column(INTEGER)
  place = Column(VARCHAR(256), nullable=False)


  def __init__(self, id, name, age, place):
    self.id = id
    self.name = name
    self.age = age
    self.place = place

def init_db():
  engine = create_engine(
    "mysql+pymysql://root:@localhost:3306/orm_test",
    encoding= "utf-8",
    echo=True
  )
  Base.metadata.create_all(engine)
  print('Create table successfully!')

if __name__ == '__main__':
  init_db()

运行后,生成的users表结构如下:

python使用SQLAlchemy操作MySQL

数据插入

接着我们插入几条测试数据,完整的代码(db_insert.py)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Sanya, Hainan
# time: 12:52

from create_table import Users
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

def insert_data():
  # 初始化数据库连接
  engine = create_engine("mysql+pymysql://root:@localhost:3306/orm_test", encoding="utf-8")
  # 创建DBSession类型
  DBSession = sessionmaker(bind=engine)

  # 创建session对象
  session = DBSession()
  # 插入单条数据
  # 创建新User对象
  new_user = Users(id=1, name='Jack', age=25, place='USA')
  # 添加到session
  session.add(new_user)
  # 提交即保存到数据库
  session.commit()

  # 插入多条数据
  user_list= [Users(id=2, name='Green', age=26, place='UK'),
        Users(id=3, name='Alex', age=31, place='GER'),
        Users(id=4, name='Chen', age=52, place='CHN'),
        Users(id=5, name='Zhang', age=42, place='CHN')
        ]
  session.add_all(user_list)
  session.commit()
  # 关闭session
  session.close()
  print('insert into db successfully!')

if __name__ == '__main__':
  insert_data()

运行程序后,表格中的数据如下:

python使用SQLAlchemy操作MySQL

数据查询

接下来演示如何进行简单的查询。我们需要查询place为CHN的人名,完整的Python代码(db_query)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Sanya, Hainan
# time: 12:52

from create_table import Users
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

def query_data():
  # 初始化数据库连接
  engine = create_engine("mysql+pymysql://root:@localhost:3306/orm_test", encoding="utf-8")
  # 创建DBSession类型
  DBSession = sessionmaker(bind=engine)

  # 创建session对象
  session = DBSession()

  # 查询所有place是CHN的人名
  # 创建Query查询,filter是where条件
  # 调用one()返回唯一行,如果调用all()则返回所有行:
  users = session.query(Users).filter(Users.place == 'CHN').all()
  print([use.name for use in users])
  # 输出:['Chen', 'Zhang']

  # 或者用如下查询
  users = session.query(Users.name).filter(Users.place == 'CHN').all()
  print(users)
  # 输出:[('Chen',), ('Zhang',)]

  session.close()


if __name__ == '__main__':
  query_data()

输出结果如下:

['Chen', 'Zhang']
[('Chen',), ('Zhang',)]

数据更新

接下来我们演示数据更新。我们需要将Jack的place修改为CHN,完整的Python代码(db_update)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Sanya, Hainan
# time: 12:52

from create_table import Users
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

def update_data():
  # 初始化数据库连接
  engine = create_engine("mysql+pymysql://root:@localhost:3306/orm_test", encoding="utf-8")
  # 创建DBSession类型
  DBSession = sessionmaker(bind=engine)

  # 创建session对象
  session = DBSession()

  # 数据更新,将Jack的place修改为CHN
  update_obj = session.query(Users).filter(Users.name=='Jack').update({"place":"CHN"})
  session.commit()

  session.close()
  print("Update data successfully!")


if __name__ == '__main__':
  update_data()

更新后的表格数据如下:

python使用SQLAlchemy操作MySQL

数据删除

接着我们演示数据删除。我们需要将Jack的记录删除,完整的Python代码(db_delete.py)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Sanya, Hainan
# time: 12:52

from create_table import Users
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

def delete_data():
  # 初始化数据库连接
  engine = create_engine("mysql+pymysql://root:@localhost:3306/orm_test", encoding="utf-8")
  # 创建DBSession类型
  DBSession = sessionmaker(bind=engine)

  # 创建session对象
  session = DBSession()

  # 数据更新,将Jack的记录删除
  update_obj = session.query(Users).filter(Users.name=='Jack').delete()
  session.commit()

  session.close()
  print("Delete data successfully!")


if __name__ == '__main__':
  delete_data()

运行程序后,表格中的数据如下:

python使用SQLAlchemy操作MySQL

本次分享到此结束,感谢大家阅读~

本文的示例代码已经上传至Github,网址为:https://github.com/percent4/ORM_test。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用str & repr转换字符串
Oct 13 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
关于Django外键赋值问题详解
Aug 13 Python
python读取excel表格生成erlang数据
Aug 26 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
Django 实现购物车功能的示例代码
Oct 08 Python
详解python之heapq模块及排序操作
Apr 04 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
Python写捕鱼达人的游戏实现
Mar 31 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
Python 实现集合Set的示例
Dec 21 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 #Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 #Python
Python基础之函数基本用法与进阶详解
Jan 02 #Python
Python面向对象原理与基础语法详解
Jan 02 #Python
Pytorch 的损失函数Loss function使用详解
Jan 02 #Python
Python面向对象封装操作案例详解 II
Jan 02 #Python
Python实现搜索算法的实例代码
Jan 02 #Python
You might like
Smarty模板快速入门
2007/01/04 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
python 图片验证码代码分享
2012/07/04 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
解读python logging模块的使用方法
2018/04/17 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Python 高效编程技巧分享
2020/09/10 Python
Python读写锁实现实现代码解析
2020/11/28 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
经贸韩语专业大学生职业规划
2014/02/14 职场文书
担保书怎么写
2014/04/01 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
刘公岛导游词
2015/02/05 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS