python和mysql交互操作实例详解【基于pymysql库】


Posted in Python onJune 04, 2019

本文实例讲述了python和mysql交互操作。分享给大家供大家参考,具体如下:

python要和mysql交互,我们利用pymysql这个库。

下载地址:
https://github.com/PyMySQL/PyMySQL

安装(注意cd到我们项目的虚拟环境后):

cd 项目根目录/abc/bin/
#执行
./python3 -m pip install pymysql

稍等片刻,就会把pymysql库下载到项目虚拟环境abc/lib/python3.5/site-packages中。(注意我项目是这个路径,你的不一定)

文档地址:
http://pymysql.readthedocs.io/en/latest/

使用:

import pymysql.cursors
# 连接数据库
connection = pymysql.connect(host='localhost',
               user='root',
               password='root',
               db='test',
               charset='utf8mb4',
               cursorclass=pymysql.cursors.DictCursor)
try:
  with connection.cursor() as cursor:
    # Read a single record
    sql = "SELECT * From news"
    cursor.execute(sql)
    result = cursor.fetchone()
    print(result) # {'id': 1, 'title': '本机新闻标题'}
finally:
  connection.close()

我们连上了本地数据库test,从news表中取数据,数据结果为{'id': 1, 'title': '本机新闻标题'}

python和mysql交互操作实例详解【基于pymysql库】

返回的结果是字典类型,这是因为在连接数据库的时候我们是这样设置的:

# 连接数据库
connection = pymysql.connect(host='localhost',
               user='root',
               password='root',
               db='test',
               charset='utf8mb4',
               cursorclass=pymysql.cursors.Cursor)

我们把cursorclass设置的是:pymysql.cursors.DictCursor

字典游标,所以结果集是字典类型。

我们修改为如下:

cursorclass=pymysql.cursors.Cursor

结果集如下:

(1, '本机新闻标题')

变成了元组类型。我们还是喜欢字典类型,因为其中包含了表字段。

Cursor对象

主要有4种:

Cursor 默认,查询返回list或者tuple
DictCursor  查询返回dict,包含字段名
SSCursor    效果同Cursor,无缓存游标
SSDictCursor 效果同DictCursor,无缓存游标。

插入

try:
  with connection.cursor() as cursor:
    sql = "INSERT INTO news(`title`)VALUES (%s)"
    cursor.execute(sql,["今天的新闻"])
  # 手动提交 默认不自动提交
  connection.commit()
finally:
  connection.close()

一次性插入多条数据

try:
  with connection.cursor() as cursor:
    sql = "INSERT INTO news(`title`)VALUES (%s)"
    cursor.executemany(sql,["新闻标题1","新闻标题2"])
  # 手动提交 默认不自动提交
  connection.commit()
finally:
  connection.close()

注意executemany()有别于execute()

sql绑定参数

sql = "INSERT INTO news(`title`)VALUES (%s)"
cursor.executemany(sql,["新闻标题1","新闻标题2"])

我们用%s占位,执行SQL的时候才传递具体的值。上面我们用的是list类型:

["新闻标题1","新闻标题2"]

可否用元组类型呢?

cursor.executemany(sql,("元组新闻1","元组新闻2"))

同样成功插入到数据表了。

把前面分析得到的基金数据入库

创建一个基金表:

CREATE TABLE `fund` (
  `code` varchar(50) NOT NULL,
  `name` varchar(255),
  `NAV` decimal(5,4),
  `ACCNAV` decimal(5,4),
  `updated_at` datetime,
  PRIMARY KEY (`code`)
) COMMENT='基金表';

准备插入SQL:

INSERT INTO fund(`code`,`name`,`NAV`,`ACCNAV`,`updated_at`)VALUES (%(code)s,%(name)s,%(NAV)s,%(ACCNAV)s,%(updated_at)s)

注意%(code)s这种占位符,要求我们执行这SQL的时候传入的参数必须是字典数据类型。

MySQL小知识:

在插入的时候如果有重复的主键,就更新

insert into 表名 xxxx ON duplicate Key update 表名

我们这里要准备执行的SQL就变成这样了:

INSERT INTO fund(code,name,NAV,ACCNAV,updated_at)VALUES (%(code)s,%(name)s,%(NAV)s,%(ACCNAV)s,%(updated_at)s)
ON duplicate Key UPDATE updated_at=%(updated_at)s,NAV=%(NAV)s,ACCNAV=%(ACCNAV)s;

1、回顾我们前面分析处理的基金网站数据
//3water.com/article/162452.htm

#...
codes = soup.find("table",id="oTable").tbody.find_all("td","bzdm")
result = () # 初始化一个元组
for code in codes:
  result += ({
    "code":code.get_text(),
    "name":code.next_sibling.find("a").get_text(),
    "NAV":code.next_sibling.next_sibling.get_text(),
    "ACCNAV":code.next_sibling.next_sibling.next_sibling.get_text()
   },)

最后我们是把数据存放在一个result的元组里了。

我们打印这个result可以看到:

({'code': '004223', 'ACCNAV': '1.6578', 'name': '金信多策略精选灵活配置', 'NAV': '1.6578'}, ...}

元组里每个元素 都是字典。

看字典是不是我们数据表的字段能对应了,但还少一个updated_at字段的数据。

2、我们把分析的网页数据重新处理一下

from datetime import datetime
updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
result = () # 初始化一个元组
for code in codes:
  result += ({
    "code":code.get_text(),
    "name":code.next_sibling.find("a").get_text(),
    "NAV":code.next_sibling.next_sibling.get_text(),
    "ACCNAV":code.next_sibling.next_sibling.next_sibling.get_text(),
    "updated_at":updated_at
   },)

3、最后插入的代码

try:
  with connection.cursor() as cursor:
    sql = """INSERT INTO fund(`code`,`name`,`NAV`,`ACCNAV`,`updated_at`)VALUES (%(code)s,%(name)s,%(NAV)s,%(ACCNAV)s,%(updated_at)s)
ON duplicate Key UPDATE `updated_at`=%(updated_at)s,`NAV`=%(NAV)s,`ACCNAV`=%(ACCNAV)s"""
    cursor.executemany(sql,result)
  # 手动提交 默认不自动提交
  connection.commit()
finally:
  connection.close()

python和mysql交互操作实例详解【基于pymysql库】

4、完整的分析html内容(基金网站网页内容),然后插入数据库代码:

from bs4 import BeautifulSoup
import pymysql.cursors
from datetime import datetime
# 读取文件内容
with open("1.txt", "rb") as f:
  html = f.read().decode("utf8")
  f.close()
# 分析html内容
soup = BeautifulSoup(html,"html.parser")
# 所有基金编码
codes = soup.find("table",id="oTable").tbody.find_all("td","bzdm")
updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
result = () # 初始化一个元组
for code in codes:
  result += ({
    "code":code.get_text(),
    "name":code.next_sibling.find("a").get_text(),
    "NAV":code.next_sibling.next_sibling.get_text(),
    "ACCNAV":code.next_sibling.next_sibling.next_sibling.get_text(),
    "updated_at":updated_at
   },)
# 连接数据库
connection = pymysql.connect(host='localhost',
               user='root',
               password='root',
               db='test',
               charset='utf8mb4',
               cursorclass=pymysql.cursors.Cursor)
try:
  with connection.cursor() as cursor:
    sql = """INSERT INTO fund(`code`,`name`,`NAV`,`ACCNAV`,`updated_at`)VALUES (%(code)s,%(name)s,%(NAV)s,%(ACCNAV)s,%(updated_at)s)
ON duplicate Key UPDATE `updated_at`=%(updated_at)s,`NAV`=%(NAV)s,`ACCNAV`=%(ACCNAV)s"""
    cursor.executemany(sql,result)
  # 手动提交 默认不自动提交
  connection.commit()
finally:
  connection.close()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python pickle 和 shelve模块的用法
Sep 16 Python
python缩进区别分析
Feb 15 Python
Python的迭代器和生成器
Jul 29 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
java字符串格式化输出实例讲解
Jan 06 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 #Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 #Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 #Python
Python3日期与时间戳转换的几种方法详解
Jun 04 #Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 #Python
python儿童学游戏编程知识点总结
Jun 03 #Python
Python控制Firefox方法总结
Jun 03 #Python
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
详解PHP中的Traits
2015/07/29 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
脚本收藏iframe
2006/07/21 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python简单读取大文件的方法
2016/07/01 Python
解决Python requests 报错方法集锦
2017/03/19 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python实现批量命名照片
2020/06/18 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
中专生自我鉴定书范文
2013/12/28 职场文书
投标承诺函范文
2015/01/21 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
检举信的写法
2019/04/10 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书