这篇文章主要记录如何使用Python操作MySQL数据库的基础知识点。
准备工作
- 在开始之前需要先安装MySQL数据库,以及应用模块MySQLdb。很简单:
$ sudo apt-get install mysql-server
$ sudo apt-get install python-mysqldb
- 接下来,需要在MySQL中建立一个新的数据库testdb和新用户Do,以便操作。
$ mysql -uroot -p
$ create database testdb;
$ create user 'Do'@'localhost' identified by '123';#创建新用户
$ use testdb;
$ grant all on testdb.* to 'Do'@'localhost';#为新用户授权
$ quit
Python DB-API
- Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。
- 不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。
- MySQLdb 是用于Python链接MySQL数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。
数据库链接
查看数据库版本信息
#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import sys
try:
con = mdb.connect('localhost', 'Do', '123', 'testdb');
cur = con.cursor()
cur.execute("select version()")
ver = cur.fetchone()
print "Database version : %s " % ver
except mdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
finally:
if con:
con.close()
- 在这个例子中,用Python链接到了MySQL,并执行了
select version()
语句。将会返回MySQL数据库的版本信息。 import MySQLdb as mdb
导入MySQLdb模块。con = mdb.connect('localhost', 'Do', '123', 'testdb');
链接MySQL。connect()
方法包含4个参数:主机、用户名、密码、数据库名称。cur = con.cursor()
cursor是“游标、光标、指针”的意思,用来记录返回的结果。cur.execute("select version()")
调用cursor的execute()
方法,并执行SQL语句。ver = cur.fetchone()
获取数据。因为只获取一条记录,所以使用fetchone()
方法。print "Database version : %s " % ver
将获取的数据打印出来。except mdb.Error, e:
错误处理。这很重要!finally:
最后一步,释放资源。
创建表 插入数据 查询
# -*- coding: utf-8 -*-
import MySQLdb as mdb
con = mdb.connect('localhost', 'Do', '123', 'testdb');
with con:
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS Writers")
cur.execute("create table Writers(ID int primary key auto_increment,Name varchar(25))")
cur.execute("insert into Writers(Name) values('Jack London')")
cur.execute("insert into Writers(Name) values('Truman Capote')")
cur.execute("select * from Writers")
for i in range(cur.rowcount):
row = cur.fetchone()
print row[0], row[1]
输出:
1 Jack London
2 Truman Capote
with con:
此处用到with关键字。能够自动释放资源,并提供错误处理。cur.execute("DROP TABLE IF EXISTS Writers")
删除已存在的表。
列名
打印出筛选的数据的同时,标注列名:
# -*- coding: utf-8 -*-
import MySQLdb as mdb
con = mdb.connect('localhost', 'Do', '123', 'testdb')
with con:
cur = con.cursor()
cur.execute("select * from Writers")
rows = cur.fetchall()
desc = cur.description
print "%s %3s" % (desc[0][0], desc[1][0])
for row in rows:
print "%2s %3s" % row
输出:
ID Name
1 Jack London
2 Truman Capote
使用占位符
在SQL语句执行之前,占位符已经锁定了它们的值。
# -*- coding: utf-8 -*-
import MySQLdb as mdb
con = mdb.connect('localhost', 'Do', '123', 'testdb')
with con:
cur = con.cursor()
cur.execute("update Writers set Name = %s where Id = %s",
("Guy", "2"))
print "Number of rows updated:", cur.rowcount
#进入MySQL查看是否更新:
mysql> select * from Writers;
+----+-------------+
| ID | Name |
+----+-------------+
| 1 | Jack London |
| 2 | Guy |
+----+-------------+
2 rows in set (0.00 sec)