一. python操作数据库介绍
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:
GadFly
mSQL
一、启动MySQL服务器,实际上上篇已讲到如何启动MySQL。两种方法:(1)是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作。(2)是在DOS方式下运行。d:/mysql/bin/mysqld 二、进入mysql交互操作界面,。
MySQL
PostgreSQL
Microsoft SQL Server 2000
Informix
Interbase
一、Mysql数据库服务器登录 登录mysql需要切换到dos下的mysql的bin目录,进行如下操作:语法格式:mysql -h host_name -u user_name -p password (本机的话-h 和host_name可省)---我---割--- My Experience:C:\。
Oracle
Sybase ...
你可以访问Python数据库接口及API查看详细的支持数据库列表。
1、首先打开电脑,然后点击左下角开始菜单按钮。2、然后在开始菜单,下方搜索框中搜索cmd,在搜索结果中点击cmd命令窗口。3、敲下回车键,打开cmd窗口,命令格式为mysql -u finley -p db_name如下图输入mysql -u root -。
不同的数据库你需要下载不同的DB API模块,mysql下好后怎么用,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。
DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。
Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。
本次操作以Dell电脑为例,具体操作步骤如下:第一步:首先,打开MySQLWorkbench,双击打开即可。打开后的界面如下所示,然后选择数据库实例,双击进行登录。图中数据库的实例是LocalinstanceMYSQL57 第二步:然后,输入用户名和。
Python DB-API使用流程:
引入 API 模块。
获取与数据库的连接。
执行SQL语句和存储过程。
关闭数据库连接。
二. python操作MySQL模块
Python操作MySQL主要使用两种方式:
DB模块(原生SQL)
PyMySQL(支持python2.x/3.x)
MySQLdb(目前仅支持python2.x)
ORM框架
SQLAchemy
2.1 PyMySQL模块
本文主要介绍PyMySQL模块,MySQLdb使用方式类似
pip install PyMySQL
2.2 基本使用
-*- coding: utf-8 -*- Date: 2018/5/13import pymysql 创建游标(查询数据返回为元组格式) 创建游标(查询数据返回为字典格式)cursor = conn.cursor(pymysql.cursors.DictCursor) 2. 执行SQL,返回受影响的行数,一次插入多行数据effect_row2 = cursor.executemany("insert into USER (NAME) values(%s)",[("jack"),("boom"),("lucy")])查询所有数据,返回数据为元组格式result = cursor.fetchall() 关闭游标cursor.close()! /usr/bin/env python __author__ = "shuke" 创建连接conn = pymysql.connect(host="127.0.0.1",port=3306,user='zff',passwd='zff123',db='zff',charset='utf8mb4') 获取新创建数据自增IDeffect_row = cursor.executemany("insert into USER (NAME)values(%s)",[("eric")]) 关闭游标cursor.close()! /usr/bin/env python __author__ = "shuke" 创建连接conn = pymysql.connect(host="127.0.0.1",port=3306,user='zff',passwd='zff123',db='zff',charset='utf8mb4') 获取第一行数据row_1 = cursor.fetchone() 获取所有数据row_3 = cursor.fetchall() 关闭连接conn.close()print(row_1)print(row_2)print(row_3)
⚠️ 在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
cursor.scroll(1,mode='relative')相对绝对位置移动
三. 数据库连接池
上文中的方式存在一个问题,单线程情况下可以满足,程序需要频繁的创建释放连接来完成对数据库的操作,那么,我们的程序/脚本在多线程情况下会引发什么问题呢?此时,我们就需要使用数据库连接池来解决这个问题!
3.1 DBUtils模块
DBUtils是Python的一个用于实现数据库连接池的模块。
此连接池有两种连接模式:
创建一批连接到连接池,供所有线程共享使用(推荐使用)
3.2 模式一
1、首先打开Mysql命令行编辑器,连接Mysql数据库;2、使用所要操作的数据库,先显示一下数据库中的表;3、显示一下表结构,了解一下表中的列;4、向表插入数据,insert into 表名 (列名) values (值);5、查询表可。
-*- coding: utf-8 -*- Date: 2018/5/13from DBUtils.PersistentDB import PersistentDBimport pymysqlPOOL = PersistentDB( creator=pymysql, 一个链接最多被重复使用的次数,None表示无限制 setsession=[], ping MySQL服务端,检查是否服务可用。 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接) threadlocal=None,! /usr/bin/env python __author__ = "shuke" 使用链接数据库的模块 maxconnections=6, 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, 一个链接最多被重复使用的次数,None表示无限制 setsession=[], ping MySQL服务端,检查是否服务可用。 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。 print('连接被拿走了',conn._con)# print('池子里目前有',POOL._idle_cache,'\r\n') cursor = conn.cursor() cursor.execute('select * from USER') result = cursor.fetchall() conn.close()return resultresult = func()print(result)
⚠️ 由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享,因此是线程安全的。如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。
3.3 加锁
-*- coding: utf-8 -*- Date: 2018/5/13import pymysqlimport threadingfrom threading import RLockLOCK = RLock()CONN = pymysql.connect(host='127.0.0.1',port=3306,user='zff',password='zff123',database='zff',charset='utf8')def task(arg): with LOCK: cursor = CONN.cursor() cursor.execute('select * from USER ') result = cursor.fetchall() cursor.close()print(result)for i in range(10): t = threading.Thread(target=task,args=(i,)) t.start()
1、打开浏览器搜索“sqlyog”并下载这个客户端软件。2、然后安装之后打开客户端软件。3、然后点击“新建”新建一个连接,然后填写mysql主机地址、用户名、密码,端口,然后点击下面的连接。4、然后在左侧选择自己要连接的数据库。
3.4 无锁(报错)
此时可以在数据库中查看连接情况: show status like 'Threads%';
四. 数据库连接池结合pymsql使用
PS: 可以利用静态方法封装到一个类中,方便使用