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冒泡排序注意要点实例详解
Sep 09 Python
python中类的属性和方法介绍
Nov 27 Python
Python中请不要再用re.compile了
Jun 30 Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
解决django接口无法通过ip进行访问的问题
Mar 27 Python
django自带的权限管理Permission用法说明
May 13 Python
记录模型训练时loss值的变化情况
Jun 16 Python
python 基于opencv操作摄像头
Dec 24 Python
总结Python连接CS2000的详细步骤
Jun 23 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
深入了解php4(2)--重访过去
2006/10/09 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
python实现巡检系统(solaris)示例
2014/04/02 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
python中sys模块是做什么用的
2020/08/16 Python
项目合作计划书
2014/01/09 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
七一建党节慰问信
2015/02/14 职场文书
食品药品安全责任书
2015/05/11 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS