Python操作数据库,完成简单的增删改查工作,以MySQL数据库为例。
Python的MySQL数据库操作模块叫MySQLdb,需要额外的安装下。一、常用方法及其参数
MySQLdb.Connect(parameters...)方法提供了以下一些常用的参数:
参数 | 描述 |
host | 数据库地址 |
user | 数据库用户名 |
passwd | 数据库密码,默认为空 |
db | 数据库库名,没有默认库 |
port | 数据库端口,默认3306 |
connect_timeout | 连接超时时间,秒为单位 |
use_unicode | 结果以unicode字符串返回 |
charset | 插入数据库编码 |
连接对象返回的connect()函数:
参数 | 描述 |
commit() | 提交事务。对支持事务的数据库和表,如果提交修改操作,不适用这个方法,则不会写到数据库中 |
rollback() | 事务回滚。对支持事务的数据库和表,如果执行此方法,则回滚当前事务。在没有commit()前提下。 |
cursor([cursorclass]) | 创建一个游标对象。所有的sql语句的执行都要在游标对象下进行。MySQL本身不支持游标,MySQLdb模块对其游标进行了仿真。 |
游标对象也提供了几种方法:
参数 | 描述 |
close() | 关闭游标 |
execute(sql) | 执行sql语句 |
excutemany(sql) | 执行多条sql语句 |
fetchone() | 从执行结果中取第一条记录 |
fetchmany(n) | 从执行结果中取n条记录 |
fetchall() | 从执行结果中取所有记录 |
scroll(self, value, mode='relative') | 游标滚动 |
二、初始环境配置
Python2.6安装升级到python2.7(如果默认是python2.7就不需要执行第一步)
1)下载Python2.7最新版本并编译安装# wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
# tar zxvf Python-2.7.12.tgz # cd Python-2.7.12 # ./configure
# make && make install # mv /usr/bin/python /usr/bin/python2.6.6# ln -s /usr/local/bin/python2.7 /usr/bin/python# python -VPython 2.7.12注意:软链接指向Python2.7版本后,yum将不能正常工作,因为yum是2.6写的不兼容2.7,所以需要指定下yum命令里默认Python版本为原来的2.6.6版本。# sed -i '1s/$/2.6.6/' /usr/bin/yum2)安装setuptools setuptools工具用来setup.py安装第三方模块。先安装下环境依赖软件包:# yum install python-devel zlib-devel openssl-devel –y下载并安装:# wget https://pypi.python.org/packages/32/3c/e853a68b703f347f5ed86585c2dd2828a83252e1216c1201fa6f81270578/setuptools-26.1.1.tar.gz# tar zxvf setuptools-26.1.1.tar.gz# cd setuptools-26.1.1# python setup.py install......如果没有安装zlib-devel软件包会报下面错误:"Compression requires the (missing) zlib module" RuntimeError: Compression requires the (missing) zlib module解决方法:安装上述的软件包,再进入刚解压的Python2.7目录重新编译安装# cd ../Python-2.7.12# make && make install# python setup.py install3)安装pip2.7 pip用于后期方面再安装第三方模块。# wget https://pypi.python.org/packages/e7/a8/7556133689add8d1a54c0b14aeff0acb03c64707ce100ecd53934da1aa13/pip-8.1.2.tar.gz# tar zxvf pip-8.1.2.tar.gz# cd pip-8.1.2# python setup.py install4)安装必要组件# yum install -y mysql-devel python-devel# yum install python-dev -y# pip install MySQL-python5)直接执行Python命令就启动默认的CPython解释器# python
Python 2.7.12 (default, Apr 2 2020, 13:16:51)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello Word!"
Hello Word!
配置自动补全# pip2.7 install readline# # pip2.7 install rlcompleter2>>> import readline, rlcompleter>>> readline.parse_and_bind("tab: complete")
三、数据库删查增改
3.1创建test数据库并允许root用户远程登陆
在数据库服务器上执行以下命令
创建test数据库
MariaDB [(none)]> create database test;
允许root用户远程登录数据库服务器
MariaDB [(none)]> grant all on *.* to root@'%' identified by 'password' with grant option;
MariaDB [(none)]> flush privileges;
测试远程连接
3.2 在test库创建一张user表,并添加一条记录
>>> import MySQLdb
>>> conn = MySQLdb.Connect(host='x.x.x.x',user='root',passwd='HUDson888', db='test',charset='utf8')
>>> cursor = conn.cursor()
>>> sql = "create table user(id int,name varchar(30),password varchar(30))"
>>> cursor.execute(sql) # 返回的数字是影响的行数
0L
>>> sql = "insert into user(id,name,password) values('1','xiaoming','123456')"
>>> cursor.execute(sql)
1L
>>> conn.commit() # 提交事务,写入到数据库
>>> cursor.execute('show tables') # 查看创建的表
>>> cursor.fetchall() #返回上一个游标执行的所有结果,默认是以元组形式返回
((u'user',),)
>>> cursor.execute('select * from user')
1L
>>> cursor.fetchall()
((1L, u'xiaoming', u'123456'),)
3.2 插入多条数据
>>> sql = 'insert into user(id,name,password) values(%s,%s,%s)'
>>> args = [('2','zhangsan','123456'), ('3','lisi','123456'),('4','wangwu','123456')]
>>> cursor.executemany(sql, args)
3L
>>> conn.commit()
>>> sql = 'select * from user'
>>> cursor.execute(sql)
4L
>>> cursor.fetchall()
((1L, u'xiaoming', u'123456'), (2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
3.3 删除
>>> sql = 'delete from user where name="xiaoming"'
>>> cursor.execute(sql)
1L
>>> conn.commit()
>>> sql = 'select * from user'
>>> cursor.execute(sql)
3L
>>> cursor.fetchall()
((2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
3.4 查询记录
>>> sql = 'select * from user'
>>> cursor.execute(sql)
3L
>>> cursor.fetchone() #获取第一行数据
(2L, u'zhangsan', u'123456')
>>> sql = 'select * from user'
>>> cursor.execute(sql)
3L
>>> cursor.fetchmany(2) #获取两行数据
((3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
3.5 以字典形式返回结果
默认显示是元组形式,要想返回字典形式,使得更易处理,就用到cursor([cursorclass])中的cusorclass参数。传入MySQLdb.cursors.DictCursor类:
>>> cursor = conn.cursor(MySQLdb.cursors.DictCursor)
>>> sql = 'select * from user'
>>> cursor.execute(sql)
3L
>>> cursor.fetchall()
({'password': u'123456', 'id': 2L, 'name': u'zhangsan'}, {'password': u'123456', 'id': 3L, 'name': u'lisi'}, {'password': u'123456', 'id': 4L, 'name': u'wangwu'})
四、遍历查询结果
#!/usr/bin/env python# -*- coding: utf-8 -*-import MySQLdbtry: conn = MySQLdb.Connect(host='x.x.x.x.',user='root',passwd='HUDson888', db='test',charset='utf8') cursor = conn.cursor() sql = "select * from user" cursor.execute(sql) for i in cursor.fetchall(): print iexcept Exception, e: print ("Connection Error: " + str(e))finally: conn.close()
# python test.py
(2L, u'zhangsan', u'123456')
(3L, u'lisi', u'123456')
(4L, u'wangwu', u'123456')
使用for循环遍历查询结果,并增加了异常处理。