安装

安装mysql数据库的难度和oracle数据库简直没得比,安装步骤如下:

安装MariaDB

yum install mariadb mariadb-server # 安装,centos7默认的mysql就是mariadb

systemctl start mariadb # 启动mariadb

systemctl enable mariadb # 开机自启动

mysql_secure_installation # 设置root密码

mysql -uroot -p # 登录

安装pymysql

pip install pymysql

基本操作

数据库基本操作主要是:

创建连接

获取游标

执行sql

提交事务:针对非查询性SQL

代码

import pymysql

# connect函数打开数据库连接

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

# cursor方法创建游标对象cur

cur = conn.cursor()

# execute方法执行SQL语句

cur.execute("SELECT VERSION()")

# fetchone方法获取单条数据

data = cur.fetchone()

print ('Database version : {}'.format(data))

# 关闭游标

cur.close()

# 关闭数据库连接

conn.close()

DDL

DDL:数据定义语言。包括创建表,创建索引等等

import pymysql

# connect函数打开数据库连接

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

# cursor方法创建游标对象cur

cur = conn.cursor()

# 创建表

sql = '''create table user (

name char(20) not null,

age int,

sex char(1))'''

cur.execute(sql)

# 关闭游标

cur.close()

# 关闭数据库连接

conn.close()

DML

DML:数据操作语言,包含增删改三项操作。

insert

import pymysql

# connect函数打开数据库连接

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

# cursor方法创建游标对象cur

cur = conn.cursor()

# 创建表

sql = '''insert into user(name, age, sex) values('suncle', 18, 'm')'''

try:

# 执行sql语句

cur.execute(sql)

# 提交到数据库执行

conn.commit()

except:

# 如果发生错误则回滚

conn.rollback()

# 关闭游标

cur.close()

# 关闭数据库连接

conn.close()

update

import pymysql

# connect函数打开数据库连接

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

# cursor方法创建游标对象cur

cur = conn.cursor()

# 创建表

sql = '''update user t set t.age = 20 where t.name='suncle' '''

try:

# 执行sql语句

cur.execute(sql)

# 提交到数据库执行

conn.commit()

except:

# 如果发生错误则回滚

conn.rollback()

# 关闭游标

cur.close()

# 关闭数据库连接

conn.close()

delete

import pymysql

# connect函数打开数据库连接

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

# cursor方法创建游标对象cur

cur = conn.cursor()

# 创建表

sql = '''delete from user where age=20 '''

try:

# 执行sql语句

cur.execute(sql)

# 提交到数据库执行

conn.commit()

except:

# 如果发生错误则回滚

conn.rollback()

# 关闭游标

cur.close()

# 关闭数据库连接

conn.close()

QUERY

基础查询

主要有三个函数

cursor.fetchall 返回行的元组

cursor.fetchmany 返回行的元组, 可以指定返回前N行 相当于对fetchall切片fetchall[:N]

cursor.fetchone 返回首行, 相当于fetchall[0]

查询语句如下:

cur.execute('''select * from user t where t.age<=19;''')

三种方法得到的结果分别为:

cur.fetchall() # (('suncle', 18, 'm'), ('suncle1', 19, 'm'))

cur.fetchmany(1) # (('suncle', 18, 'm'),)

cur.fetchone() # ('suncle', 18, 'm')

可见:每行数据也是一个元组, 元组的内容由sql决定

如果要让返回的数据带上列名,也就是要返回字典,那么就需要用到cursors.DictCursor。

DictCursor

创建cursor时创建DictCursor类型的就可以fetch回来字典形式的结果了

代码

import pymysql

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

# 创建cursor时指定cursor参数cursor=pymysql.cursors.DictCursor表示cursor类型

cur = conn.cursor(cursor=pymysql.cursors.DictCursor)

cur.execute('''select * from user t where t.age<=20;''')

cur.fetchall()

fetchall返回结果为:

[{'age': 18, 'name': 'suncle', 'sex': 'm'},

{'age': 19, 'name': 'suncle1', 'sex': 'm'},

{'age': 20, 'name': 'suncle2', 'sex': 'm'}]

返回每一行记录都是一个字典,整体结果是由字典组成的列表。而默认的cursor是由元组组成的元组。

参数化查询

基础的SQL注入

import pymysql

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

cur = conn.cursor()

def get_user(age=18):

sql = '''select * from user t where t.age<={};'''.format(age)

cur.execute(sql)

return cur.fetchall()

get_user() # 返回(('suncle', 18, 'm'),)

get_user('18 or 1=1') # 返回(('suncle', 18, 'm'), ('suncle1', 19, 'm'))

当传入参数的age中带sql条件的时候,就会发生sql注入,使得结果可能并不满足要求。

为了解决sql注入,我们可以使用参数化查询。

使用参数化查询

以上代码做以下修改之后就可以避免sql注入

import pymysql

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

cur = conn.cursor()

def get_user(age=18):

# 不管数据库定义的是什么类型,统一使用%s

sql = '''select * from user t where t.age<=%s;'''.format(age)

cur.execute(sql, (age, )) # 参数化查询

return cur.fetchall()

参数化查询最大的优势在于避免了SQL注入,同时参数化之后避免了sql多次硬解析,能提高查询效率。所以,总是应该使用参数化查询。

上下文管理

数据库连接和游标都支持上下文管理。

游标

查看cur实例对应Cursor类的方法

cur = conn.cursor()

help(cur)

对应的with语句使用如下

with cur:

cur.execute('''select * from user''')

cur.execute('''select * from user''') # 抛出错误:ProgrammingError: Cursor closed

with语句块结束之后cur就已经关闭了。

连接

通过help命令查看Connection类的__enter__和__exit__两种方法的实现

conn = pymysql.connect(host='192.168.110.13', user='root', password='123456', database='student')

help(conn) # conn是Connection类

查看结果如下:

| __enter__(self)

| Context manager that returns a Cursor

|

| __exit__(self, exc, value, traceback)

| On successful exit, commit. On exception, rollback

__enter__方法会返回一个游标

__exit__方法:如果成功推出就会自动提交commit,如果发生异常就会回滚rollback

对应的with语句使用如下

with conn as cur:

cur.execute('''update user t set t.age = 20 where t.name='suncle' ''')

cur.execute('''select * from user''') # 退出with块之后游标仍然没有关闭

虽然游标没有关闭, 但是数据库操作已经提交。

游标和连接共同上下文管理

with conn as cur:

with cur:

cur.execute('''update user t set t.age = 20 where t.name='suncle' ''')

退出整个上下文管理块之后,游标会关闭,并且会自动提交。

数据库连接池

一般来说,应用程序访问数据库的过程是:

装载数据库驱动程序

建立数据库连接

访问数据库,执行sql语句

断开数据库连接

相对于性能正常的SQL的执行效率来说,建立连接是一个费时的活动,而且系统还要为每一个连接分配内存资源。在现在web请求的大并发量情况下,必然会导致频繁的数据库操作。而频繁的进行数据库连接操作势必占用很多的系统资源,使得系统的响应速度下降,严重的甚至会造成服务器的崩溃。

引入数据库连接池技术之后,应用程序访问数据库的过程是:

请求数据库操作时,从连接池中取出创建好的数据库连接

执行sql语句

不断开数据库连接,而是放回连接池中,等待下次使用

连接池还有个优点就是能控制数据库的压力,当大量用户同时涌入时,连接池只会使用池限制数据库连接数目,而不会不停的向数据库请求连接,最后导致服务器崩溃。

Python实现数据库连接池

使用队列Queue保存数据库连接

代码如下

from queue import Queue

import pymysql

class ConnectionPool(): # args和kwargs用来接收数据库url信息

def __init__(self, size, *args, **kwargs):

self.args = args

self.kwargs = kwargs

self.size = size

self.pool = Queue(maxsize=self.size)

for _ in range(self.size):

self.pool.put(self._connect())

def _connect(self):

return pymysql.connect(*self.args, **self.kwargs)

@staticmethod

def _close(conn):

conn.close()

def get_connection(self):

return self.pool.get()

def return_connection(self, conn):

return self.pool.put(conn)

def close_pool(self):

while not self.is_empty():

self._close(self.pool.get())

def is_empty(self):

return self.pool.empty()

def is_full(self):

return self.pool.full()

def current_connection_count(self):

return self.pool.qsize()

pool = ConnectionPool(20, host='192.168.110.13', user='root', password='123456', database='student')

conn = pool.get_connection() # 获取数据库连接

print(conn) #

print(pool.current_connection_count()) # 19

cur = conn.cursor()

cur.execute("SELECT VERSION()")

data = cur.fetchone()

print ('Database version : {}'.format(data[0]))

cur.close()

pool.return_connection(conn) # 关闭游标之后需要回收数据库连接

print(pool.current_connection_count()) # 20

记得帮我点赞哦!

念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。

> 我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。

>

> 听我说,进步多,程序人生一把梭

>

> 如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!

python下载pymysql_Python pymysql相关推荐

  1. python下载地址-python下载网址

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. python下载windows下载windows下载页面https:ww ...

  2. 用python下载文件的若干种方法汇总

    压缩文件可以直接放到下载器里面下载的 you-get 连接 下载任意文件 重点 用python下载文件的若干种方法汇总 写文章 用python下载文件的若干种方法汇总 zhangqibot发表于Met ...

  3. 【CV】Python下载安装及环境变量配置教程

    目录 Python下载 Python安装 Python环境变量配置 Python下载 可通过https://www.python.org/downloads/下载 1.进入网页后点击Windows,其 ...

  4. python 下载大文件

    python 下载大文件 文件过大,建议用迅雷 下载大文件 import os import time import requests# 下载大文件 def download_data(url, pa ...

  5. Python下载文件的11种方式

    译者:天天向上    英文原文: https://dzone.com/articles/simple-examples-of-downloading-files-using-python 在本教程中, ...

  6. python下载文件暂停恢复_python下载文件记录黑名单的实现代码

    具体代码如下所示: #!/usr/bin/python # -*- coding: GBK -*- # -*- coding: UTF-8 -*- from ftplib import FTP imp ...

  7. 测试Python下载图片的三种方法

    简 介: 通过Python软件包对网络URL图片链接进行下载,可以加快后期处理.本文测试了urllib, request两个软件包对图片进行下载效果.如果图片原网页有了防止下载机制,是无法下载图片. ...

  8. Python学习之解决python下载第三方依赖速度慢的问题

    Python学习之解决python下载第三方依赖速度慢的问题 参考文章: (1)Python学习之解决python下载第三方依赖速度慢的问题 (2)https://www.cnblogs.com/su ...

  9. Python 下载依赖包环境经常失败超时解决方法

    Python 下载依赖包环境经常失败超时解决方法 参考文章: (1)Python 下载依赖包环境经常失败超时解决方法 (2)https://www.cnblogs.com/boonya/p/11909 ...

最新文章

  1. 团队暑期集训 - 基础DP练习
  2. 免费下载!200+讲者核心观点公布!2021最强AI学术会议视频全部回放
  3. 动态显示时采色改为单帧采色
  4. 自由意志是否受机器控制?
  5. java--面向接口编程
  6. php直接读取csv文件,php实现的读取CSV文件函数示例
  7. 黑科技揭秘:眼科大夫如何应用5G+8K完成远程会诊?
  8. 600个开源iOS应用库
  9. 原在一个tableView上应用不同类型的DTAttributedTextCell
  10. PS学习笔记6-选区工具
  11. 关于Sentinel-2快速查询图幅号——使用MGRS_100kmSQ_ID_File_Geodatabase快速查询
  12. XIlinx MIG 控制DDR3 SO-DIMM内存条(一):内存条SO-DIMM规范与内存颗粒时序参数
  13. python智能决策系统_智能风控决策引擎系统可落地实现方案(三)模型引擎实现...
  14. 使用 FFmpeg 删除导出视频字幕文件
  15. 【杂七杂八的笔记】2019CVPR论文快读
  16. winscp 登录 am4379 的 linux系统 连接被意外关闭
  17. 离散Laplace-Beltrami 算子
  18. Thinking in Java 中闪耀的星星(三)
  19. 秦牧鸿蒙之体有什么用,玄幻:开局奖励鸿蒙圣体
  20. Bingo说说:虚拟产品项目玩法解析,新手也能操作的暴利赚钱术

热门文章

  1. 301跳转与URL转发
  2. 计算机季度函数,季度怎么分月份(根据月份函数生成季度)
  3. 贴牌系统(SaaS)与定制开发的区别是什么?
  4. 天梯赛 L2-028 秀恩爱分得快 (25 分)[测试点3 4 5][未填坑]
  5. 日常更新《一篇文章入门编程系列之从零基础入门HTML+CSS前端开发》12.23
  6. Caffeine的基础使用
  7. 双击背面截图_ios14怎么双击后盖截图 苹果双击背面截图原理详解 (图文)
  8. vue3创建一个响应屏幕高度变化的全局指令
  9. Vue请求URL格式化,拒绝分号自动转义
  10. Android BLE与终端通信(二)——Android Bluetooth基础搜索蓝牙设备显示列表