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实现对excel文件列表值进行统计的方法
Jul 25 Python
解决python爬虫中有中文的url问题
May 11 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
浅析python继承与多重继承
Sep 13 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
Python web如何在IIS发布应用过程解析
May 27 Python
Python中递归以及递归遍历目录详解
Oct 24 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
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
javascript折半查找详解
2015/01/26 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
JS高级运动实例分析
2016/12/20 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
Vue.directive()的用法和实例详解
2018/03/04 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
django使用html模板减少代码代码解析
2017/12/12 Python
python爬虫实现中英翻译词典
2019/06/25 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
Shell编程面试题
2016/05/29 面试题
英语硕士生求职简历的自我评价
2013/10/15 职场文书
经济管理专业毕业生推荐信
2013/11/11 职场文书
中专毕业生自我鉴定
2013/11/21 职场文书
捐款倡议书范文
2014/02/02 职场文书
揠苗助长教学反思
2014/02/04 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL