就像Java连MySQL需要加载jdbc驱动一样,python的标准数据接口Python DB-API为开发人员提供了数据库应用编程接口,可以支持很多种数据库,今天我们以mysql为例来介绍python如何操作数据库。
你可以访问 Python数据库接口及API查看详细的支持数据库列表。
不同的数据库需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。
DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。
MySQLdb
MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。
安装MySQLdb
为了用DB-API编写MySQL脚本,必须确保已经安装了MySQLdb。复制以下代码,并执行:
import MySQLdb
如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块:
Traceback (most recent call last):
File "test.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb
MySQLdb可以从下面的网址下载安装包,
如果想下载Windows版可以去这个网站 http://sourceforge.net/projects/mysql-python ,安装过程按照安装提示即可完成。
如果想下载的是Linux的安装包可以去这个网站,https://pypi.org/project/MySQL-python/
下载好以后开始在Linux系统下解压:
gunzip MySQL-python-1.2.2.tar.gz
tar -zxf MySQL-python-1.2.2.tar
cd MySQL-python-1.2.2
python setup.py build
python setup.py install
pymysql
python3以后是不支持MySQLdb了,但是可以使用pymysql包,可以直接通过pymysql进行连接。直接在cmd窗口输入命令安装就好了。
pip install pymysql
mysqldb 与 pymsql在用法上几乎相同,只是前者支持python2,后者支持python3,所以根据自己的版本使用就行了。
连接mysql数据库流程图
Connection()
参数解析:
- host:数据库主机名.默认是用本地主机
- port:MySQL服务使用的TCP端口.默认是3306,数字类型
- user:数据库登陆名.默认是当前用户
- password:数据库登陆的秘密.默认为空
- db:要使用的数据库名.没有默认值
- charset:数据库编码
cursor()
cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple,才支持len()和index()操作,这也是它是迭代器的原因。
但同时为什么说它是生成器呢?因为cursor只能用一次,即每用完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。
常用方法解析:
- close():关闭此游标对象
- fetchone():得到结果集的下一行
- fetchmany(size):得到结果集的下几行
- fetchall():得到结果集中剩下的所有行
- excute(sql[, args]):执行一个数据库查询或命令
- excutemany(sql, args):执行多个数据库查询或命令
数据库连接前准备
- 已经创建了MySQL数据库 testdb
- 创建了表 employee
- EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME
- 连接数据库TESTDB使用的用户名为 “root” ,密码为 “123”
- 虚拟机上已经安装了 Python MySQLdb 模块。
使用pycharm操作:
连接Mysql数据库
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cursor = db.cursor()
#使用execute方法执行SQL语句
cursor.execute("SELECt VERSION()")
#使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
print "Database version : %s " % data
#关闭数据库连接
db.close()
执行结果:
Database version : 5.1.38
python操作mysql创建表
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cus = db.cursor()
#如果数据表已经存在使用 execute() 方法删除表。
cus.execute("DROP TABLE IF EXISTS EMPLOYEE")
#创建表SQL语句
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT
)"""
cus.execute(sql)
#关闭数据库连接
db.close()
python操作mysql添加数据
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cus = db.cursor()
#SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cus.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
#关闭数据库连接
db.close()
第二种添加方法:
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cus = db.cursor()
#SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES (%s, %s, %s, %s, %s )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
#执行sql语句
cursor.execute(sql)
#提交到数据库执行
db.commit()
except:
#发生错误时回滚
db.rollback()
#关闭数据库连接
db.close()
python操作mysql查询数据
Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
- fetchone(): 该方法获取下一个查询结果集,结果集是一个对象。
- fetchall():接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
查询EMPLOYEE表中age大于20的所有数据:
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cus = db.cursor()
#SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \ WHERe AGE> %s" % (20)
try:
#执行SQL语句
cus.execute(sql)
#获取所有记录列表
results = cus.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print "fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data"
#关闭数据库连接
db.close()
执行结果:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
python操作mysql修改数据
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cus = db.cursor()
#SQL 修改语句
sql = "UPDATe EMPLOYEE SET AGE = AGE + 1 WHERe SEX = '%c'" % ('M')
try:
#执行SQL语句
cus.execute(sql)
#提交到数据库执行
db.commit()
except:
#发生错误时回滚
db.rollback()
#关闭数据库连接
db.close()
python操作mysql删除数据
import MySQLdb
#或者
import pymysql
#打开数据库连接
db = MySQLdb.connect("localhost", "root", "123", "testdb", charset='utf8' )
#或者
db = pymysql.connect("localhost", "root", "123", "testdb", charset='utf8' )
#使用cursor()方法获取操作游标
cus = db.cursor()
#SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERe AGE > %s" % (20)
try:
#执行SQL语句
cus.execute(sql)
#提交修改
db.commit()
except:
#发生错误时回滚
db.rollback()
#关闭连接
db.close()
Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。
对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。