SQL 必知必会
陈旸
清华大学计算机博士
73337 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

17丨如何使用Python操作MySQL?

处理authentication plugin caching_sha2错误
捕获异常信息
关闭数据库连接
删除球员数据
修改球员身高
查询身高大于等于2.08的球员
插入新球员
关闭游标
返回查询结果集中的行数
取出数据集中的多条数据
取出数据集中的所有行
读取数据集中的一条数据
执行数据库查询
开启事务、提交和回滚
创建游标
关闭数据库连接
创建数据库连接
关闭数据库连接
执行SQL语句
与数据库建立连接
引入API模块
为各种DBMS提供统一的访问接口
提供数据库对象连接、对象交互和异常处理的方式
实战练习题
另一种方式:采用ORM框架
重点掌握Connection和Cursor对象
注意事项
删除数据
修改数据
读取数据
增加数据
Cursor对象管理
Connection对象管理
创建数据库连接
安装mysql-connector
使用步骤
作用
统一访问接口
总结
对数据表进行增删改查
如何使用mysql-connector
Python DB API规范
如何使用Python操作MySQL?

该思维导图由 AI 生成,仅供参考

我们之前都是直接在 DBMS 里面进行 SQL 的操作,实际上我们还可以通过后端语言对 DBMS 进行访问以及进行相应的操作,这样更具有灵活性,可以实现一些较为复杂的操作。作为一个后端开发人员,掌握一些 SQL 技术是必须的;作为一个数据库管理人员,了解后端语言如何开发和管理数据库也是很有必要的。
今天我以 Python 为例,讲解下如何对 MySQL 数据库进行操作。你需要掌握以下几个方面的内容:
Python 的 DB API 规范是什么,遵守这个规范有什么用?
基于 DB API,MySQL 官方提供了驱动器 mysql-connector,如何使用它来完成对数据库管理系统的操作?
CRUD 是最常见的数据库的操作,分别对应数据的增加、读取、修改和删除。在掌握了 mysql-connector 的使用方法之后,如何完成对数据表的 CRUD 操作?

Python DB API 规范

Python 可以支持非常多的数据库管理系统,比如 MySQL、Oracle、SQL Server 和 PostgreSQL 等。为了实现对这些 DBMS 的统一访问,Python 需要遵守一个规范,这就是 DB API 规范。我在下图中列出了 DB API 规范的作用,这个规范给我们提供了数据库对象连接、对象交互和异常处理的方式,为各种 DBMS 提供了统一的访问接口。这样做的好处就是如果项目需要切换数据库,Python 层的代码移植会比较简单。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用Python操作MySQL数据库,重点介绍了使用官方提供的mysql-connector驱动进行数据库连接和操作的方法。通过讲解DB API规范、连接管理和游标管理等内容,读者可以快速了解Python操作MySQL的基本原理和实际操作步骤。此外,文章还提到了采用ORM框架进行数据库操作的另一种方式,以及在简单操作时自行实现的可行性。通过实际代码示例和练习题,读者可以更好地掌握Python操作MySQL的技术要点。整体而言,本文为读者提供了实用的技术指导,帮助他们快速掌握Python操作MySQL数据库的方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(42)

  • 最新
  • 精选
  • JustDoDT
    import json import traceback import mysql.connector # 读取数据库链接配置文件 with open('mysql.json', encoding='utf-8') as con_json: con_dict = json.load(con_json) # 打开数据库链接 db = mysql.connector.connect( host=con_dict['host'], user=con_dict['user'], passwd=con_dict['passwd'], database=con_dict['database'], auth_plugin=con_dict['auth_plugin'], ) # 获取操作游标 cursor = db.cursor() try: sql = 'SELECT id, name, hp_max FROM heros WHERE hp_max>6000' cursor.execute(sql) data = cursor.fetchall() print(cursor.rowcount, '查询成功。') for each_hero in data: print(each_hero) except Exception as e: # 打印异常信息 traceback.print_exc() finally: cursor.close() db.close() # 建议吧数据库链接信息写到配置文件里,防止密码泄露。

    作者回复: Good Job

    2019-07-19
    3
    42
  • 一叶知秋
    sqlalchemy用习惯了。。。献丑来一段Python代码吧 ```Python # -*- coding:utf-8 -*- from sqlalchemy import and_ from sqlalchemy import Column, INT, FLOAT, VARCHAR from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Test_db: def __init__(self): """此处填上自己的连接配置""" self.engine = create_engine( 'mysql+pymysql://username:password@host:port/db_name?charset=utf8') db_session = sessionmaker(bind=self.engine) self.session = db_session() def query_all(self, target_class, query_filter): result_list = self.session.query(target_class).filter(query_filter).all() self.session.close() return result_list class Heros(Base): """定义表结构""" __tablename__ = 'heros' id = Column(INT(), primary_key=True) name = Column(VARCHAR(255)) hp_max = Column(FLOAT()) mp_max = Column(FLOAT()) def __init__(self, id, name, hp_max, mp_max): self.id = id self.name = name self.hp_max = hp_max self.mp_max = mp_max if __name__ == '__main__': db_obj = Test_db() query_filter = and_(Heros.hp_max > 6000) heros = db_obj.query_all(Heros, query_filter) for hero_info in heros: print("id:{}, name:{}, hp_max:{}, mp_max:{}".format(hero_info.id, hero_info.name, hero_info.hp_max, hero_info.mp_max)) ``` id:10000, name:夏侯惇, hp_max:7350.0, mp_max:1746.0 id:10046, name:钟馗, hp_max:6280.0, mp_max:1988.0 id:10048, name:鬼谷子, hp_max:7107.0, mp_max:1808.0 id:10051, name:赵云, hp_max:6732.0, mp_max:1760.0 id:10052, name:橘石京, hp_max:7000.0, mp_max:0.0 id:10055, name:杨戬, hp_max:7420.0, mp_max:1694.0 id:10056, name:达摩, hp_max:7140.0, mp_max:1694.0 id:10057, name:孙悟空, hp_max:6585.0, mp_max:1760.0 id:10058, name:刘备, hp_max:6900.0, mp_max:1742.0 .....执行结果有点多字数限制了 Process finished with exit code 0

    作者回复: Good Job

    2019-07-19
    8
  • mickey
    # -*- coding: UTF-8 -*- import mysql.connector import traceback # 打开数据库连接 db = mysql.connector.connect( host="localhost", user="root", passwd="123456", # 写上你的数据库密码 database='nba', auth_plugin='mysql_native_password' ) # 获取操作游标 cursor = db.cursor() try: # 查询heros 表中最大生命值大于 6000 的英雄进行查询,并且输出相应的属性值。 sql = 'SELECT name, hp_max FROM heros WHERE hp_max > %s ORDER BY hp_max DESC' val = (6000,) cursor.execute(sql, val) data = cursor.fetchall() for each_player in data: print(each_player) except Exception as e: # 打印异常信息 traceback.print_exc() # 回滚 db.rollback() finally: # 关闭游标 & 数据库连接 cursor.close() db.close() 输出: ('廉颇', 9328.0) ('白起', 8638.0) ('程咬金', 8611.0) ('刘禅', 8581.0) ('牛魔', 8476.0) ('张飞', 8341.0) ('庄周', 8149.0) ('刘邦', 8073.0) ('项羽', 8057.0) ('亚瑟', 8050.0) ('东皇太一', 7669.0) ('典韦', 7516.0) ('曹操', 7473.0) ('杨戬', 7420.0) ('夏侯惇', 7350.0) ('吕布', 7344.0) ('哪吒', 7268.0) ('墨子', 7176.0) ('老夫子', 7155.0) ('达摩', 7140.0) ('鬼谷子', 7107.0) ('关羽', 7107.0) ('钟无艳', 7000.0) ('橘石京', 7000.0) ('刘备', 6900.0) ('太乙真人', 6835.0) ('孙膑', 6811.0) ('赵云', 6732.0) ('扁鹊', 6703.0) ('铠', 6700.0) ('露娜', 6612.0) ('孙悟空', 6585.0) ('钟馗', 6280.0) ('雅典娜', 6264.0) ('兰陵王', 6232.0) ('宫本武藏', 6210.0) ('娜可露露', 6205.0) ('高渐离', 6165.0) ('芈月', 6164.0) ('不知火舞', 6014.0) ('孙尚香', 6014.0) Process finished with exit code 0

    作者回复: Good Job

    2019-07-19
    6
  • 夜路破晓
    auth_plugin='mysql_native_password' 哪位亲给解释下这个参数

    作者回复: 密码验证方式,采用明文

    2019-07-19
    2
    5
  • 大斌
    核心代码: cursor = db.cursor() sql = "select name,hp_max from heros where hp_max > %s" val = (6000,) cursor.execute(sql,val) data = cursor.fetchall() 注意:val里面的元素后面必须要加英文逗号,不加或者中文逗号都会报错

    作者回复: Good Job

    2019-07-23
    3
    4
  • victor666
    Python直接写SQL比Java方便多了

    作者回复: 哈哈 是的 Python代码更简洁

    2020-03-22
    2
  • 丁丁历险记
    当一些听着很虚的理论用于实战时,其威力是巨大的,例如信息的正交性。

    作者回复: 这种信息论的内容在机器学习中用的还是挺多的

    2019-11-15
    3
    2
  • taoist
    import pymysql import pymysql.cursors cfg = { "host": "127.0.0.1", "user": "root", "passwd": "toor", "database": "test", "charset": "utf8mb4", "autocommit": True, 'cursorclass':pymysql.cursors.DictCursor } db_con = pymysql.connect(**cfg) try: with db_con.cursor() as cur: cur.execute("SELECT id,name,hp_max FROM heros WHERE hp_max > 6000 ") res = cur.fetchall() for i in res: print(i) finally: db_con.close()

    作者回复: 正确

    2019-12-19
    1
  • __author__ = 'Administrator' # -*- coding: UTF-8 -*- import traceback import json import mysql.connector # 打开数据库连接 db = mysql.connector.connect( host="localhost", user="root", passwd="hjf@2019", # 写上你的数据库密码 database='nba', auth_plugin='mysql_native_password' ) # 获取操作游标 cursor = db.cursor() # 执行 SQL 语句 #cursor.execute("SELECT VERSION()") # 获取一条数据 #data = cursor.fetchone() #print("MySQL 版本: %s " % data) # 关闭游标 & 数据库连接 # 插入新球员 sql = "INSERT INTO player (team_id,player_id,player_name,height) VALUES (%s, %s, %s,%s)" val = (1003, 10038," 约翰 - 科林斯 ", 2.08) cursor.execute(sql,val) db.commit() print(cursor.rowcount, " 记录插入成功。") cursor.close() db.close()

    作者回复: Good Job

    2019-08-21
  • 老师在插入数据的时候,漏掉了 player_id ?

    作者回复: 默认设置的是递增的,就不需要指定player_id

    2019-08-21
收起评论
显示
设置
留言
42
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部