MySQL 之 pymysql
MySQL 之 pymysql
一、概述
pymysql是python用来连接mysql的工具,安装方式:pip install pymysql -i https://pypi.douban.com/simple
这里使用豆瓣的镜像安装,可能会快点
二、使用
pymysql内置非常多的方式来操作mysqlServer
1. 连接
首先还是剖其源码查看
def __init__(self, host=None, user=None, password="",
database=None, port=0, unix_socket=None,
charset='', sql_mode=None,
read_default_file=None, conv=None, use_unicode=None,
client_flag=0, cursorclass=Cursor, init_command=None,
connect_timeout=10, ssl=None, read_default_group=None,
compress=None, named_pipe=None,
autocommit=False, db=None, passwd=None, local_infile=False,
max_allowed_packet=16*1024*1024, defer_connect=False,
auth_plugin_map=None, read_timeout=None, write_timeout=None,
bind_address=None, binary_prefix=False, program_name=None,
server_public_key=None):
通常在项目中,数据库的连接的信息一般写在config.py文件中,然后调用即可
pysql.connect(host="", user="", password="", database="", charset="utf8md4")
以上connect的参数不必赘述
2. 执行SQL
先建一张表,用来测试数据
create database run default character set utf8mb4 collate utf8mb4_general_ci;
create table info(
id int primary key auto_increment,
name varchar(20) not null,
age int not null
)charset=utf8mb4;
创建一个配置文件,用来存放数据库的连接信息
'''
数据库连接信息
'''
HOST = "xxx.xxx.xxx.xxx"
USER = "root"
PASSWORD = "Asd.1234"
DATABASE = "run"
PORT = 3306
使用OOP思想来写基本框架
import pymysql
from config import HOST,USER, PASSWORD, DATABASE, PORT
class ConnectToMysql(object):
def __init__(self):
self.db = pymysql.connect(host=HOST, user=USER, password=PASSWORD, database=DATABASE, port=PORT)
self.cursor = self.db.cursor() # 执行完毕返回的结果集默认以元组显示
def insert_to_db(self):
'''
数据的插入操作
'''
pass
def query(self):
'''
数据的查询操作
'''
pass
def upate(self):
'''
数据的更新操作
'''
pass
def delete(self):
'''
数据的删除操作
'''
pass
def main(self):
pass
if __name__ == "__main__":
mysql = ConnectToMysql()
mysql.main()
一下的代码只展示需要填充的方法
以上代码中,cursor为游标,而在执行SQL语句使用
cursor.execute(SQL),当然,还有cusor.executemany(SQL)以执行多条SQL语句,其中的main函数需根据自身编写
2.1 插入数据
这里牵扯一个游标的问题,游标就是一个数据集合的指针,用来指向一条特定的数据行
通俗的讲,关系型数据库是面向集合的,在写sql 语句时,逻辑上也是面向集合的。而游标是面向行的,可以想象它是一个指针,逐行读取数据。
可以认为,通常的查询,就好像去提款机取款,例如,取1000,就是一次取1000;而游标是每次取100,取10次(假设100是最小单位)。
所以,通常游标是有“害” 的,会造成更多的I/O,消耗更多的资源,一般不建议使用游标。
存在即合理,有时候不得不使用游标,可能旧代码的写法,可能是业务复杂,而不得不使用游标;总之,它只是作为一种补充手段存在。
def insert_to_db(self):
'''
数据插入的操作:编写SQL、执行SQL、提交、关闭连接(当然,该实验中在最后关闭游标和连接)
'''
sql = "insert into info (name, age) values ('chancey', 18)"
self.cursor.execute(sql)
self.db.commit()
self.cursor.close()
self.db.close()
在插入数据之后必须提交才能将数据提交到数据库,现在查询一下数据库
mysql> select * from run.info;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | chancey | 18 |
+----+---------+-----+
1 row in set (0.00 sec)
执行多条SQL语句
def insert_to_db(self):
sql = "insert into info (name, age) values (%s, %s)"
data = [("waller", 21), ("mary", 25)]
self.cursor.executemany(sql, data)
self.db.commit()
self.cursor.close()
self.db.close()
查看数据库
mysql> select * from run.info;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | chancey | 18 |
| 2 | waller | 21 |
| 3 | mary | 25 |
+----+---------+-----+
3 rows in set (0.00 sec)
2.2 查询数据
同样的,执行SQL语句,但是在想要返回查询结果,则需要用fet函数来接收
- cursor.fetall() # 接收所有返回的查询结果
- cursor.fetone() # 接收第一条返回的查询结果
- cursor.fetmany() # 接收指定数量返回的查询结果,如果参数为空,则默认第一条
def query(self):
sql = "select name,age from info"
self.cursor.execute(sql)
info1 = self.cursor.fetchone() # 返回第一条结果
info2 = self.cursor.fetchmany(2) # 返回剩下结果的前两条
info3 = self.cursor.fetchall() # 返回剩下的所有结果
print(info1)
print(info2)
print(info3)
self.cursor.close()
self.db.close()
需要注意的是,第一次提取的数据在第二次提取的集合中是没有的,所以,提取结果的次数直接影响提取的结果
另外,该方法返回的是元组
2.3 更新数据
话不多说,直接代码
def upate(self):
sql = "update info set age=%s where name=%s"
self.cursor.execute(sql, [14, "waller"]) # 传多个参数需要用列表传参
self.db.commit()
self.cursor.close()
self.db.close()
查询一下数据库
mysql> select * from run.info;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | chancey | 18 |
| 2 | waller | 14 |
| 3 | mary | 25 |
+----+---------+-----+
3 rows in set (0.00 sec)
2.4 删除数据
def delete(self):
sql = "delete from info where name=%s"
self.cursor.execute(sql, "waller")
self.db.commit()
self.cursor.close()
self.db.close()
查询数据库
mysql> select * from run.info;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | chancey | 18 |
| 3 | mary | 25 |
+----+---------+-----+
2 rows in set (0.00 sec)
MySQL 之 pymysql的更多相关文章
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
- MySQL之pymysql模块
MySQL之pymysql模块 import pymysql #s链接数据库 conn = pymysql.connect( host = '127.0.0.1', #被连接数据库的ip地址 po ...
- 第二百七十九节,MySQL数据库-pymysql模块操作数据库
MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...
- Python3操作MySQL基于PyMySQL封装的类
Python3操作MySQL基于PyMySQL封装的类 在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...
- python成长之路【第十三篇】:Python操作MySQL之pymysql
对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎 ...
- mysql、pymysql、SQLAlchemy
1.MySQL介绍 http://www.cnblogs.com/wupeiqi/articles/5699254.html,基础操作参见此文章,此处不赘述. 安装:yum install mysql ...
- python操作mysql之pymysql
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mys ...
- Python操作MySQL -即pymysql/SQLAlchemy用法
本节介绍Python对于MySQL的一些操作用法 模块1:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基本相同,学会pymysql,使用MySQLdb也就不是 ...
- Python自动化运维之18、Python操作 MySQL、pymysql、SQLAchemy
一.MySQL 1.概述 什么是数据库 ? 答:数据的仓库,和Excel表中的行和列是差不多的,只是有各种约束和不同数据类型的表格 什么是 MySQL.Oracle.SQLite.Access.MS ...
随机推荐
- java volatile关键字作用及使用场景
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...
- Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文
前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...
- java高并发系列 - 第21天:java中的CAS操作,java并发的基石
这是java高并发系列第21篇文章. 本文主要内容 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用ja ...
- 使用vue实现行列转换的一种方法。
行列转换是一个老生常谈的问题,这几天逛知乎有遇到了这个问题.一个前端说,拿到的数据是单列的需要做转换才能够绑定,折腾了好久才搞定,还说这个应该后端直接出数据,不应该让前端折腾. 这个嘛,行列转换在后端 ...
- elk系列教程:docker中安装配置elk
elasticSearch Docker安装elasticsearch: docker pull docker.io/elasticsearch:7.2.0 启动: docker run -p 920 ...
- 浅谈微服务架构与服务治理的Eureka和Dubbo
前言 本来计划周五+周末三天自驾游,谁知人算不如天算,周六恰逢台风来袭,湖州附近的景点全部关停,不得已只能周五玩完之后,于周六踩着台风的边缘逃回上海.周末过得如此艰难,这次就聊点务虚的话题,一是浅谈微 ...
- MySQL一键生成实体文件的神器-ginbro
Java转过来的同学对Mybatis的使用肯定不陌生,特别是对一堆表去生成相应的dao和entity的时候使用Mybatis generator所带来的感触,无比深刻.前面我们也讲过原生的数据库使用, ...
- 转载 | textarea 在浏览器中固定大小和禁止拖动
HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...
- android ——滑动菜单
一.DrawerLayout是一个拥有两个子控件的布局,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容: <android.support.v4.widget.Drawer ...
- Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接
---恢复内容开始--- 写在前面的废话:岂可修!感觉最近好忙啊,本来今天还有同学约我出去玩的.(小声bb) 正文开始:之前已经编译好的着色器中还有一些问题,比如 layout(location=0) ...