0%

Python下使用MySQL

安装

  • MySQL, 到官网根据自己系统下载并安装[这种方式不推荐,安装配置比较麻烦]

    这里介绍免安装的方式:

1.官网下载MySQL,根据系统选择64bit或32bit
2.设置环境变量:
添加MYSQL_HOME=D:\mysql-5.6.22-winx64
path后添加%MYSQL_HOME%\bin
3.将D:\mysql-5.6.22-winx64\my-default.ini 拷贝一份并修改为my.ini
设置如下几项:
basedir = D:/mysql-5.6.22-winx64 datadir = D:/mysql-5.6.22-winx64/data port = 3306
4.安装MySQL服务:在cmd(管理员权限)下运行mysqld -install
启动服务:net start mysql
停止服务:net stop mysql
5.配置用户密码:默认密码为空
设置密码:mysqladmin -uroot -p password <新密码> 将新密码替换为你自己的密码,按Enter,提示输入原密码,直接再按下Enter即可
6.登陆:运行mysql -u root -p回车输入密码即可,接下你就可以进行数据库的各项操作了

  • MySQLdb, 提供python连接MySQL的API,对于不同系统:
    windows:在这里下载exe安装(win8.1下无法安装时选择兼容模式)
    Linux:利用下面的命令安装:sudo apt-get install python-mysqldb
    Mac:参看 install MySQLdb using Macport

基本语法

这里介绍3个主要用到的数据类型

数据类型

  • 整型
    整型
    取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
    int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度。
  • 浮点型
    浮点型
    设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
  • 字符串
    字符串
    charvarchar
  1. char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
  1. char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
  1. char类型的字符串检索速度要比varchar类型的快。

varchartext

  1. varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
  2. text类型不能有默认值。
  3. varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

SQL操作

对于常见SQL操作和语句,网上有很多资料,这里不再赘述,推荐下面两个:

这里也推荐一个SQL的语法规范:

Python下使用SQL

连接SQL

1
2
import MySQLdb
db = MySQLdb.connect(host=MY_HOST, user=MY_USER, passwd=MY_PASS, db=MY_DB)

SQL操作

创建cursor对象

为了进行数据库相关的操作,在Python DB-API 2.0定义了cursor对象,在进行任意一项操作之前必须创建cursor对象,语法如下:

1
cur = db.cursor()

执行SQL操作

  • 创建表
1
cur.execute("CREATE TABLE song ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, title TEXT NOT NULL )")
  • 执行单次查询

    1
    2
    3
    4
    songs = ('Purple Haze', 'All Along the Watch Tower', 'Foxy Lady')
    for song in songs:
    cur.execute("INSERT INTO song (title) VALUES (%s)", song)
    print "Auto Increment ID: %s" % cur.lastrowid
  • 多次查询

    1
    cur.execute("SELECT * FROM song WHERE id = %s or id = %s", (1,2))

    注意两个元素在同一个元组中,按从左到右的顺序与python语句中的%s对应

  • 执行选择语句

    1
    2
    3
    numrows = cur.execute("SELECT * FROM song")
    print "Selected %s rows" % numrows
    print "Selected %s rows" % cur.rowcount

    上下两个语句是等价的,不过Python DB-API 2.0推荐使用第二种方式

获取结果

  • 获取单个结果
    1
    2
    cur.execute("SELECT * FROM song WHERE id = 1")
    print "Id: %s -- Title: %s" % cur.fetchone()
  • 获取多个结果
    1
    2
    3
    4
    5
    6
    7
    # Print results in comma delimited format
    cur.execute("SELECT * FROM song")
    rows = cur.fetchall()
    for row in rows:
    for col in row:
    print "%s," % col
    print "\n"

    两种方式无优劣之分,可以根据自己的任务需求选择合适的获取方式

异常处理

推荐在SQL语句操作时加入异常处理,提高程序稳定性。异常处理方式与Python中的类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Get data from database
try:
cur.execute("SELECT * FROM song")
rows = cur.fetchall()
except MySQLdb.Error, e:
try:
print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])
except IndexError:
print "MySQL Error: %s" % str(e)
# Print results in comma delimited format
for row in rows:
for col in row:
print "%s," % col
print "\n"

结束操作

  • 关闭数据库连接
    1
    2
    # Close all cursors
    cur.close()
  • 清理cursor对象
    1
    2
    # Close all databases
    db.close()

以上就是一些简单的python操作SQL操作,更多cursor对象的方法、定义可以参见下面的在线文档:

其他更加复杂的SQL操作可以参看—->>>


参考链接