MySQL-python数据库模块用法

本文主要介绍在python中如何使用MySQL数据库。

准备工作

安装mysql

  • Linux (Ubuntu)

apt-get install mysql-server

安装完成之后在命令行中输入:mysql -uroot -proot,看是否能够成功登入MySQL命令行,如果能够成功登入,则说明安装成功。

  • Windows

下载MSI安装包mysql-installer-community-5.7.19.0.msi安装,官网地址:https://dev.mysql.com/downloads/installer/

注:注意下载页面这样一句话:Note: MySQL Installer is 32 bit, but will install both 32 bit and 64 bit binaries.

也就是说32位版本和64位版本的安装包是二合一的。

下载之后打开一路Next安装即可,只需在有一步设置账号的时候设置好MySQL的登录用户名和密码即可(比如我设置的用户名/密码是:root/root)。

安装完成之后在命令行中输入:mysql -uroot -proot,看是否能够成功登入MySQL命令行,如果能够成功登入,则说明安装成功;如果提示找不到mysql命令,则还需要手工把mysql.exe的路径添加到环境变量,比如我的路径是:C:\Program Files\MySQL\MySQL Server 5.7\bin

安装MySQL-python驱动模块

  • Linux (Ubuntu)

pip install MySQL-python

  • Windows

Windows下直接用pip install MySQL-python命令安装会报错:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':No such file or directory

解决方法:

在命令行中输入python命令打开python控制台,查看本地安装的python是32位的还是64位的,然后根据本地python的位数来下载如下两个安装包的其中之一:

32位:MySQL-python-1.2.5.win32-py2.7.exe,下载地址:https://pan.baidu.com/s/1qYa5H4w

64位:MySQL-python-1.2.5.win-amd64-py2.7.exe,下载地址:https://pan.baidu.com/s/1qYa5H4w

在安装时可能还会遇到问题:python version 2.7 required which was not found in the registry

解决方法:下载register.py文件,并在命令行中用python命令执行该脚本即可,下载地址:https://pan.baidu.com/s/1mihz25M

验证安装是否成功

进入python交互式环境,输入:import MySQLdb,如果没有报错,则表明安装mysql及MySQL-python成功。

在virtualenv虚拟化环境中安装MySQL-python

如果日常使用的是virtualenv环境,因为virtualenv是相对独立的环境,所以还需要单独安装MySQL-python。

  • Linux (Ubuntu)

pip install MySQL-python

  • Windows

在主环境安装好MySQL-python后,进入python安装目录(如:C:\Python27)下的lib\site-packages目录下,找到如下四组文件/文件夹:

MySQL_python-1.2.5-py2.7.egg-info(文件夹)

MySQLdb (文件夹)

_mysql_exceptions.py/_mysql_exceptions.pyc/_mysql_exceptions.pyo (文件)

_mysql.pyd(文件)

然后把以上几个文件/文件夹都复制到virtualenv安装目录的lib\site-packages目录下。然后在virtualenv环境下进入pyton交互式环境,输入import MySQLdb验证是否成功。

预置mysql数据

  • 在命令行中登录mysql(假如用户名/密码是:root/root):mysql -uroot -proot

以下命令都是在登录mysql后的mysql命令行中执行的:

  • 查看当前有哪些数据库:show databases;

  • 创建一个新的名为info的数据库:create database info;

  • 切换到info数据库:use info;

  • 创建一个表person:create table person(id int not null auto_increment primary key,name varchar(32),age int);

  • 查看当前有哪些表:show tables;

  • 往person表中插入一些数据:

insert into person(name,age) values('Tom',18);
insert into person(name,age) values('John',23);
insert into person(name,age) values('Amy',15);
  • 查询person表:select * from person;
mysql> select * from person;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | Tom  |   18 |
|  2 | John |   23 |
|  3 | Amy  |   15 |
+----+------+------+
3 rows in set (0.00 sec)

用python操作数据库

连接mysql

导入包:

import MySQLdb

获取数据库连接对象:

conn = MySQLdb.connect(user = 'root',passwd = 'root',host = '127.0.0.1')

注:MySQLdb.connect()函数可以接收的常用的几个参数:

  • host:连接的服务器主机名,默认为本机(localhost)

  • user:数据库用户名,默认为当前用户

  • passwd:用户登录密码,无默认值

  • db:连接的数据库名,无默认值

  • read_default_file:使用指定的mysql配置文件

  • port:连接端口,默认为3306

  • connect_timeout:连接超时时间,单位为秒

获取游标(相当于一个指针):

cur = conn.cursor()

设置当前数据库为info:

conn.select_db('info')

注:不建议在python中操作数据库创建表。

执行sql语句插入数据

假如向person表中插入数据:

sql = 'insert into person(name,age) values("Zhangsan",34)'  # 组装sql
cur.execute(sql)  # 执行sql
conn.commit()  # 提交,如果没有这句,更改不会生效
cur.close()
conn.close()  # 用完之后最好关闭游标和连接对象

此时去mysql中,进入info数据库,查询:select * from person;,结果如下:

mysql> select * from person;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | Tom      |   18 |
|  2 | John     |   23 |
|  3 | Amy      |   15 |
|  4 | Zhangsan |   34 |
+----+----------+------+
4 rows in set (0.00 sec)

发现成功插入一条数据。

批量插入数据

使用占位符和列表:

sql = 'insert into person(name,age) values(%s,%s)'
cur.execute(sql,('Lisi',23))  # 插入一条数据
persons = [('Wangwu',32),('Zhaoliu',12),('Tianqi',45)]
cur.executemany(sql,persons)  # 插入多条
conn.commit()  # 提交

此时去mysql中,进入info数据库,查询:select * from person;,结果如下:

mysql> select * from person;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | Tom      |   18 |
|  2 | John     |   23 |
|  3 | Amy      |   15 |
|  4 | Zhangsan |   34 |
|  5 | Lisi     |   23 |
|  6 | Wangwu   |   32 |
|  7 | Zhaoliu  |   12 |
|  8 | Tianqi   |   45 |
+----+----------+------+
8 rows in set (0.07 sec)

删除数据

sql = 'delete from person where name = "Tianqi"'
cur.execute(sql)
conn.commit()
mysql> select * from person;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | Tom      |   18 |
|  2 | John     |   23 |
|  3 | Amy      |   15 |
|  4 | Zhangsan |   34 |
|  5 | Lisi     |   23 |
|  6 | Wangwu   |   32 |
|  7 | Zhaoliu  |   12 |
+----+----------+------+
7 rows in set (0.00 sec)

更新数据

sql = 'update person set age = 88 where name = "Zhaoliu"'
cur.execute(sql)
conn.commit()
mysql> select * from person;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | Tom      |   18 |
|  2 | John     |   23 |
|  3 | Amy      |   15 |
|  4 | Zhangsan |   34 |
|  5 | Lisi     |   23 |
|  6 | Wangwu   |   32 |
|  7 | Zhaoliu  |   88 |
+----+----------+------+
7 rows in set (0.00 sec)

查询数据

sql = 'select * from person'
cur.execute(sql)
# 取查到的所有结果,并把游标移到结尾
print '【Output 1】'
print cur.fetchall()

# 把游标移到开头
cur.scroll(0,'absolute')

# 取查到的前n条数据,并把游标移到第n+1位置
print '【Output 2】'
print cur.fetchmany(3)

# 把游标移到开头
cur.scroll(0,'absolute')

# 取查到的一条数据,并把游标向后移动一位
print '【Output 3】'
print cur.fetchone()
print cur.fetchone()
【Output 1】
((1L, 'Tom', 18L), (2L, 'John', 23L), (3L, 'Amy', 15L), (4L, 'Zhangsan', 34L), (5L, 'Lisi', 23L), (6L, 'Wangwu', 32L), (7L, 'Zhaoliu', 88L))
【Output 2】
((1L, 'Tom', 18L), (2L, 'John', 23L), (3L, 'Amy', 15L))
【Output 3】
(1L, 'Tom', 18L)
(2L, 'John', 23L)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容