mysql用 fifo 记录日志_Python学习第四十七天记录打call:mysqlclient操作MySQL关系型数据库...
本篇文章主要讲解mysqlclient操作MySQL关系型数据库,安装mysqlclient的命令行:pip install mysqlclient;
然后创建一个名为XKD_Python_Course的数据库和一张名为students的数据库表,我们先在命令行工具里面查看一下表名是否存在,登录mysql数据库的命令行:mysql -uroot -p,然后show databases;,发现没有XKD_Python_Course这个数据库,那我们就创建一个:create database XKD_Python_Course;,创建完再:show databases;一下,可以看到XKD_Python_Course数据库已经存在了
XKD_Python_Course数据库
然后我们可以使用命令行:use XKD_Python_Course;进入这个库,然后开始创建数据库表;
CREATE TABLE `students` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
创建表
然后可以通过命令行:show create table students;,查看一下创建表的创建;查看表创建
还可以通过命令行:desc students;,查看表的结构;表结构
此时我们已经创建好了数据库和数据库表,然后我们需要授权用户,设置密码,授权成功之后一定要记得刷新权限;
grant all on XKD_Python_Course.* to 'zengzeng'@'%' identified by '123456';
# 刷新权限
flush privileges;授权后我们可以退出,然后登录我们刚刚授权的用户:mysql -uzengzeng -p123456,就可以成功登录,登录后可以show databases;查看一下刚刚创建的数据库查看数据库
然后我们可以看到里面有两个数据库,如果我们想操作XKD_Python_Cours,那我们就需要使用:use XKD_Python_Course
操作数据库
刚刚我们安装的mysqlclient中有一个MySQLdb类,我们可以用这个MySQLdb类去操作mysql数据库插入操作,在插入之前我们可以先查看一下数据表里是否已经存在这条数据:select * from students;,然后可以放心的进行插入了
import MySQLdb
connect = None # 连接对象
cursor = None # 游标对象
try:
# 连接对象
connect = MySQLdb.connect(host='localhost', # 主机地址
user='zengzeng', # 账号
password='123456', # 密码
database='XKD_Python_Course', # 数据库名
use_unicode=True,
charset='utf8') # 指定字符集
# 游标对象
cursor = connect.cursor() # 通过连接对象调用cursor()
except Exception as e:
print(e)
connect.close()
try:
if cursor:
result = cursor.execute("insert into students (name, age) values ('Angle', 18)") # 插入操作
print('result = {}'.format(result))
connect.commit() # 提交
except Exception as e:
print(e)
connect.rollback() # 回滚
finally:
if cursor:
cursor.close()
if connect:
connect.close()
执行代码,返回的结果是result = 1,表示操作了一行数据,这时我们查看数据库表select * from students;,是不是发现表中多了一条数据啊;
查询
批量插入数据,就是在插入数据的地方增加一个for循环,我们来试一下一次插入10条数据;
import MySQLdb
connect = None # 连接对象
cursor = None # 游标对象
try:
# 连接对象
connect = MySQLdb.connect(host='localhost', # 主机地址
user='zengzeng', # 账号
password='123456', # 密码
database='XKD_Python_Course', # 数据库名
use_unicode=True,
charset='utf8') # 指定字符集
# 游标对象
cursor = connect.cursor() # 通过连接对象调用cursor()
except Exception as e:
print(e)
connect.close()
try:
if cursor:
for i in range(10):
result = cursor.execute("insert into students (name, age) values ('Angle', {})".format(i)) # 插入操作
connect.commit() # 提交
except Exception as e:
print(e)
connect.rollback() # 回滚
finally:
if cursor:
cursor.close()
if connect:
connect.close()
插入多条数据
查询数据,查询结果的id会随着游标往下走
import MySQLdb
from pprint import pprint # 换行
connect = None # 连接对象
cursor = None # 游标对象
try:
# 连接对象
connect = MySQLdb.connect(host='localhost', # 主机地址
user='zengzeng', # 账号
password='123456', # 密码
database='XKD_Python_Course', # 数据库名
use_unicode=True,
charset='utf8') # 指定字符集
# 游标对象
cursor = connect.cursor() # 通过连接对象调用cursor()
except Exception as e:
print(e)
connect.close()
try:
if cursor:
cursor.execute('select * from students') # 不会返回任何对象,想要拿到数据可以通过cursor.方法名
one_result = cursor.fetchone() # 查询结果集的下一条数据
many_result = cursor.fetchmany(5) # 查询结果集的下五条数据
all_result = cursor.fetchall() # 查询结果集的剩余所有数据
# 换行打印
pprint(one_result)
print('*' * 100)
pprint(many_result)
print('*' * 100)
pprint(all_result)
connect.commit() # 提交
except Exception as e:
print(e)
connect.rollback() # 回滚
finally:
if cursor:
cursor.close()
if connect:
connect.close()
查询结果
cursorcursor是游标对象,用于执行查询和获取结果;
cursor游标支持的方法execute(op[,args]):执行一个数据库的查询和命令;
fetchmany(size):获取结果集的下几行务;
fetchone() :获取结果集的下一行;
fetchall():获取结果集中剩下的所有行;
rowcount():最近一次execute返回数据的行数或影响的行数;
close():关闭游标对象;
查询参数化
在使用子查询的时候,我们就可以使用查询参数
# 位置参数
cursor.execute('select * from students where id = %s', args=(10, ))
# 关键字参数
cursor.execute('select * from students where id = %(id)s', args={'id': 10})
使用上下文管理
会自动关闭游标
import MySQLdb
connect = MySQLdb.connect(host='localhost',
user='zengzeng',
password='123456',
database='XKD_Python_Course',
use_unicode=True,
charset='utf8')
with connect as cursor:
# 会自动关闭cursor对象
cursor.execute("insert into students (name, age) values ('zengzeng', 22)")
# 此时连接还没有关闭
cursor.execute("insert into students (name, age) values ('Mark', 23)")
connect.close()
Queue模块
Queue模块实现了多生产者多消费者队列,尤其适合多线程编程,Queue类中实现了所有需要的锁原语,Queue模块实现了三种类型队列:第一种,FIFO(先进先出)队列,第一加入队列的任务,被第一个取出;
第二种,LIFO(后进先出)队列,最后加入队列的任务,被第一个取出(操作类似与栈,总是从栈顶取出,这个队列还不清楚内部的实现);
第三种,PriorityQueue(优先级)队列,保持队列数据有序,最小值被先取出;
queue模块中的Queue与multiprocessing模块的Queue的区别queue模块中的Queue:是普通的队列模式,先进先出模式,get方法会阻塞请求,直到有数据get出来为止,适用于多线程的场景
from threading import Thread, Event
from queue import Queue
import time
def write(q: Queue, e: Event):
for value in range(100):
print('put {} to queue'.format(value))
q.put(value)
time.sleep(0.5)
else:
e.set()
def read(q: Queue, e: Event):
while True :
if not q.empty() or not e.is_set():
value = q.get()
print('get {} from queue'.format(value))
time.sleep(1)
else:
break
if __name__ == '__main__':
q = Queue()
e = Event()
tw = Thread(target=write, args=(q,e))
tr = Thread(target=read, args=(q,e))
tw.start()
tr.start()
tw.join()
tr.join()
print('finished ')multiprocessing模块的Queue:是多进程并发的Queue队列,用于解决多进程间的通信问题。
from multiprocessing import Process,Queue, Event
import time
def write(q: Queue, e: Event):
for value in range(100):
print('put {} to queue'.format(value))
q.put(value)
time.sleep(0.5)
else:
e.set()
def read(q: Queue, e: Event):
while True :
if not q.empty() or not e.is_set():
value = q.get()
print('get {} from queue'.format(value))
time.sleep(1)
else:
break
if __name__ == '__main__':
q = Queue()
e = Event()
pw = Process(target=write, args=(q,e))
pr = Process(target=read, args=(q,e))
pw.start()
pr.start()
pw.join()
pr.join()
print('finished ')
Queue队列对象的方法qsize():返回队列的大致大小;
empty():判断队列是否为空,如果队列为空,返回True,反之False;
full():判断是否满了;
put():将项目放入队列;
put_nowait:相当于put(item, False);
get():从队列中删除并返回一个项目;
get_nowait():提供了两种方法来支持跟踪守护进程消费者线程是否已完全处理入队任务;
task_done():表示以前排队的任务已完成;
join():阻止直到队列中的所有项目都已获取并处理完毕;
使用Queue构建连接池
from queue import Queue
import MySQLdb
class ConnectPool:
def __init__(self, size=5, *args, **kwargs):
if not isinstance(size, int) or size < 1:
size = 10
self.__pool = Queue(size)
for i in range(size):
self.__pool.put(MySQLdb.connect(*args, **kwargs))
@property
def connect(self):
return self.__pool.get()
@connect.setter
def connect(self, conn):
self.__pool.put(conn)
if __name__ == '__main__':
# 构建连接池
pool = ConnectPool(host='localhost',
user='zengzeng',
password='123456',
database='XKD_Python_Course',
use_unicode=True,
charset='utf8')
# 获取一个连接
connect = pool.connect
#
with connect as cursor:
with cursor:
sql = 'select * from students'
cursor.execute(sql)
print(cursor.fetchall())
线程连接池实现
from queue import Queue
import MySQLdb
import threading
class ConnectPool:
def __init__(self, size=5, *args, **kwargs):
if not isinstance(size, int) or size < 1:
size = 10
self.__pool = Queue(size)
for i in range(size):
self.__pool.put(MySQLdb.connect(*args, **kwargs))
# 创建一个local对象
self.local = threading.local()
@property
def connect(self):
return self.__pool.get()
@connect.setter
def connect(self, conn):
self.__pool.put(conn)
def __enter__(self):
if getattr(self.local, 'conn', None) is None:
self.local.conn = self.connect
return self.local.conn.cursor()
def __exit__(self, *exc_info):
if exc_info:
self.local.conn.rollback()
else:
self.local.conn.commit()
# 将连接对象归还到连接池
self.connect = self.local.conn
# 线程级别的连接对象引用计算器减一
self.local.conn = None
if __name__ == '__main__':
pool = ConnectPool(host='localhost',
user='zengzeng',
password='123456',
database='XKD_Python_Course',
use_unicode=True,
charset='utf8')
def foo(pool):
with pool as cursor:
with cursor: # 对cursor做上下文管理
sql = 'select * from students'
cursor.execute(sql)
print(cursor.fetchall())
for i in range(5):
t = threading.Thread(target=foo, args=(pool, ))
t.start()
mysql用 fifo 记录日志_Python学习第四十七天记录打call:mysqlclient操作MySQL关系型数据库...相关推荐
- JavaScript学习(四十七)—构造方法创建对象的不足
JavaScript学习(四十七)-构造方法创建对象的不足 构造方法创建对象的不足 如果将所有的属性和方法都封装到构造方法中,那么在创建对象时,每个对象身上都会有独立的一份构造方法中的属性和方法. 如 ...
- mysql用 fifo 记录日志_MySQL一丢丢知识点的了解
1. MySQL体系结构 从概念上讲,数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合:数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何 ...
- golang mysql 插入_Mysql学习(一)添加一个新的用户并用golang操作Mysql
Mysql添加一个新的用户并赋予权限 添加一个自己的用户到mysql 首先我们需要先用root用户登录mysql,但是刚安装完没有密码,我们先跳过密码 ailumiyana@ailumiyana:~/ ...
- 根据数据库表gengxin实体类_Python学习第四十八天记录打call:SQLALchemy操作MySQL关系型数据库...
1.SQLALchemy使用 安装 pip install sqlalchemy: SQLAlchemy是Python编程语言下的一款开源软件,是PythonSQL工具包和对象关系映射器,它为应用程序 ...
- 如何用mysql创建orders表_MySQL学习十四创建和操纵表
摘要: 本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记). 本博讲述表的创建.更改和删除的基本知识. 一.创建表 MySQL不仅用 ...
- python变量类型是动态的_Python 学习 第四篇:动态类型模型
Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...
- python定义变量类型为数字_python 学习(四)- 变量类型
一.变量的定义和使用 为什么需要变量?当然是通过变量来存储数据,而存储的数据类型可能是数字.字符串.字符等等,将这些数据存储在变量中,可以方便我们去使用,除了变量之外还有一个常量,区别就是,常量是不可 ...
- python课后心得体会_PYTHON学习第四天课后总结:
第三天学习课后总结: 今日重点: 流程控制 1,if 条件判断语句 2,while 循环 3,for 循环 一,if +条件判断语句: 1> if+条件判断表达式: 子代码1 子代码2 子代 ...
- python语句print(tuple(range(2)))_Python学习(四)数据结构 —— list tuple range
序列类型 list tuple range list 和 tuple list: 列表,由 [] 标识: 有序:可改变列表元素 tuple: 元组,由 () 标识: 有序:不可改变元组元素(和 ...
- python的函数结构_Python学习(四)常见函数及控制结构
,常用函数: 1,type(变量名)返回该变量的类型 2,print()函数: print(value, ..., sep=' ', end='\n', file=sys.stdout, flush= ...
最新文章
- Android广播监听usb插拔状态
- esxi直通 gen8_HP MicroServer Gen8与ESXI采坑之旅
- PHP高手干货分享:不能不看的50个细节!
- c语言分量的运算符,C语言基础(04-运算符和表达式)
- 界面设计方法(2)— 6.功能按钮设计(删除,保存,提交)
- JavaScript面向对象:类、方法、属性
- Android开发之Canvas rotate方法释疑
- OGC 开放地理信息系统协会
- 如何在Java中生成比特币钱包地址
- flask 上传excel 前端_flask 笔记
- history(路由控制)
- Java 使用 Redis | 菜鸟教程
- word和wps安装mendeley插件
- 【数据库】浅析Innodb的聚集索引与非聚集索引
- 电脑桌面没有计算机图标鼠标也点不起来,电脑桌面上的图标不见了,鼠标也没用了该怎么办呢?...
- CHM:新生儿肠道微生物菌群研究
- 陪诊系统app开发,一个应用可切换不同身份
- 极客日报:恶意软件感染超1000万台安卓设备;淘宝App已支持“云闪付”付款;OpenSSH 8.8发布
- 20180823-cve
- 【Lesson 13】万能和弦和弦走向
热门文章
- 金币 详解(C++)
- java接口深入理解_深入理解Java的接口和抽象类
- 编译内核_Linux内核编译(自己实现的网卡上面测试c1000k案例)
- 安卓app可以用python写吗_安卓app可以用python写吗
- ios 企业签名需要源文件么_苹果ios企业签名是什么?苹果ios企业签名了解一下!...
- vscode替换文字快捷键_这 21 个VSCode 快捷键,能让你的代码飞起来
- 视频播功能及画面协同操作注意事项
- 支付宝 支付宝扫描生成的二维码提示:码已失效,请刷新二维码后重试
- Java 8 Optional
- 高并发实战之幂等处理