python读写mysql总结
一、MySQLdb包的安装
1. 在win环境下,下载MySQL-python-1.2.3,有两种方式:
(1) 下载src源码.tar.gz(这个源码需要build编译再安装.egg包(当于.jar包));
不过这种方法之后需要修改环境变量和MySQLdb.conf文件夹里的配置文件等等,具体网上去搜对应版本,我用的第二种方法,在python命令行里直接import MySQLdb;没有出现任何问题。
(2) 直接下载MySQL-python-1.2.3.exe安装包(双击直接安装);
这里直接安装的.exe,在python命令行里import没问题,在PyCharm里import没问题,但在pydev里引入就提示”uncheck package”,估计是pydev这个插件本身就有一些不完善的功能,要不就是最容易忽略的错误:忘记设置环境变量或者环境变量设置的路径错误。
2. 解决eclipse里pydev插件不能引入MySQLdb包的问题:强制编译,而不仅是要在构建路径里引入库文件、.egg包(当于.jar包)等
解决方案:
Eclipse中,windows==>preference==>Pydev中,配置Interpreter-Python的ForcedBuiltins选项卡内容,手动添加内容MySQLdb,将模块强制编译进去。
如果仅操作"构建路径System PYTHONPATH"的内容,引入库文件,无论如何不会解决问题。一定要强制编译进去!!!
二、连接数据库
python连接mysql主要用到了游标cursor来访问,这个是MySQLdb自带的。
补充几个对象的方法和属性:
1.connection的参数:conn=MySQLdb.connect(“localhost”, “root”, “123456”, “testdb”)
亦作conn = MySQLdb.connect(host=’localhost’,user=’root’, passwd=’123456’, db=’testdb’)
注意这里没有写明端口号port=3306,是因为MySQLdb默认端口号为3306,不用指定,如果你自己改了,就要写上。
connection的参数:
- host,连接的数据库服务器主机名,默认为本地主机(localhost)。
- user,连接数据库的用户名,默认为当前用户。
- passwd,连接密码,没有默认值。
- db,连接的数据库名,没有默认值。
- port,指定数据库服务器的连接端口,默认是3306
- conv,将文字映射到Python类型的字典。默认为MySQLdb.converters.conversions
- cursorclass,cursor()使用的种类,默认值为MySQLdb.cursors.Cursor。
- compress,启用协议压缩功能。
- named_pipe,在windows中,与一个命名管道相连接。
- init_command,一旦连接建立,就为数据库服务器指定一条语句来运行。
- read_default_file,使用指定的MySQL配置文件。
- read_default_group,读取的默认组。
- unix_socket,在unix中,连接使用的套接字,默认使用TCP。
2.connection(连接)对象
方法名 作用
conn. close() 关闭数据库
conn.commit() 提交当前事务
----- 必须sql写完后要提交commit(),尤其是insert,
update, delete时,否则数据库没有变化!!!
----- 而像select这种普通的查询,不涉及修改数据库的,是否commit()没有关系
conn.rollback() 取消当前事务
---- 异常处理except Exception:里最好还是加上回滚rollback()
conn.cursor() 获取当前连接的游标对象
conn.rrorhandler(cxn,cur,errcls,errval) 作为已给游标的句柄
3.cursor游标对象属性及方法
(1) cursor执行命令的方法
callproc(sql, procname, args) 执行存储过程,接收参数为存储过程名和参数列表,返回值为受影响的行数
execute(sql,param, args) 执行单条sql语句,接收参数param,返回值为args受影响的行数
executemany(sql,param, args) 执行多条sql语句,接收参数param,返回值为args受影响的行数
next() 使用迭代对象得到结果的下一行
nextset() / nestset(self): 移动到下一个结果集(如果支持的话)
close() 关闭游标
connection 创建此游标的连接(可选)
(2) cursor用来接收返回值的方法
fetchone() 返回一条结果行
fetchall(self) 匹配所有剩余结果
fetchmany(size-cursor,arraysize) 匹配结果的下几行
rowcount 读取数据库表中的行数,最后一次execute()返回或影响的行数
scroll(self, value, mode=’relative’):移动指针到某一行。如果mode=’relative’,则表示从当前所在行移动value条,如果mode=’absolute’,则表示从结果集的第一行移动value条
arraysize 使用fetchmany()方法时一次取出的记录数,默认为1
discription 返回游标的活动状态,包括(7元素):
(name,type_code,display_size,internal_size,precision,scale,null_ok)其中name, type_code是必须的。
lastrowid 返回最后更新行的ID(可选),如果数据库不支持,返回None
__iter__() 创建迭代对象(可选,参考next())
messages 游标执行好数据库返回的信息列表(元组集合)
rownumber 当前结果集中游标的索引(从0行开始)
setinput-size(sizes) 设置输入最大值
setoutput-size(sizes[,col]) 设置列输出的缓冲值
三、代码
(1) mysql_1.py
import MySQLdb try:
conn = MySQLdb.connect(host='localhost', user='root', passwd='mysql', db='testdb') # 默认port可以不写3306
cursor = conn.cursor()
sql = "insert into table1 values('105', 'tomy', 23, 'm', 'U.KK.')"
cursor.execute(sql)
conn.commit() #提交事务commit()
cursor.execute("select * from table1")
results = cursor.fetchall()
for re in results:
print re
cursor.close()
conn.close()
except MySQLdb.Error, e:
conn.rollback() #回滚rollback()
print "MySQL Error %d: %s" % (e.args[0], e.args[1])
print e
(2) mysql_2.py
# -*-encoding: utf-8 -*-
import os
import string
import sys
import MySQLdb # 连接数据库
try:
conn = MySQLdb.connect(host='localhost',port=3306, user='root', passwd='mysql', db='testdb')
except Exception, e:
print e
sys.exit() # 获取cursor游标对象来进行操作
cursor = conn.cursor() # 创建表
sql = "create table if not exists test1(name varchar(128) primary key, age int(4))"
cursor.execute(sql)
print "success create table test1!" # 插入数据
sql = "insert into test1(name, age) values('%s', '%d')" % ("denny", 23)
try:
cursor.execute(sql)
conn.commit() #凡是insert,update,delete都要"提交事务commit()",否则数据库不会改变
print "succeess insert a record!"
except Exception, e:
conn.rollback() #异常必须回滚rollback()
print e
# 插入多条数据
sql = "insert into test1(name, age) values (%s, %s)"
param = (("tom", 24), ("alice", 25), ("bob", "26"))
try:
cursor.executemany(sql, param) #批量插入数据时必须用.executemany(sql)而不是.execute(sql),那是单条数据
conn.commit()
print "success insert many records!"
except Exception, e:
conn.rollback()
print e # 查询出数据
sql = "select * from test1"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回就循环输出,alldata是个二维列表)
if alldata:
for rec in alldata:
print rec[0], rec[1] # 分别输出,结果为denny 23
# print rec # 也可以直接输出rec,不带下标rec[i], 结果为('denny', 23L) # 关闭连接
cursor.close()
conn.close()
控制台输出结果:
SQL表结果:
(3) mysql_3.py (fetchone()示例)
import MySQLdb db = MySQLdb.connect("localhost", "root", "mysql", "testdb" )
cursor = db.cursor()
cursor.execute("select * from test1")
data = cursor.fetchone()
while data!=None:
print data[1]
data = cursor.fetchone()
db.close
(4) mysql_4.py(fetchall()示例)
import MySQLdb db = MySQLdb.connect("localhost", "root", "mysql", "testdb" )
cursor = db.cursor()
cursor.execute("select * from test1")
datas = cursor.fetchall()
for data in datas:
print data[1]
print cursor.rowcount,"rows in tatal"
db.close
python读写mysql总结的更多相关文章
- python读写mysql数据库
方法一: 1. python连接mysql数据库:需要用到 pymysql 库和 sqlalchemy库: import pandas as pd from sqlalchemy import cre ...
- python读写mysql
读取mysql数据 # -*- coding: utf-8 -*- # 导入必要模块 import pandas as pd from sqlalchemy import create_engine ...
- Python自动化 【第十二篇】:Python进阶-MySQL和ORM
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...
- 使用python将mysql数据库的数据转换为json数据
由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ...
- Python 12 - Mysql & ORM
本节内容 1.数据库介绍 2.mysql数据库安装使用 3.mysql数据库基础 4.mysql命令 5.事务 6.索引 7.Python操作mysql 8.ORM sqlalchemy了解 数据库介 ...
- 使用 python 管理 mysql 开发工具箱 - 2
这篇博文接着上篇文章<使用 python 管理 mysql 开发工具箱 - 1>,继续写下自己学习 python 管理 MySQL 中的知识记录. 一.MySQL 的读写分离 学习完 My ...
- 06 python操作MySQL和redis(进阶)
python操作mysql.redis 阶段一.mysql事务 主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息, ...
- python 3 mysql 索引原理与慢查询优化
python 3 mysql 索引原理与慢查询优化 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最 ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
随机推荐
- CentOSyum操作
查看已经安装yum: yum list installed|grep mysql 查看yum: yum list|grep mysql 更新yum: rpm -ivh mysql-community- ...
- mysql 较为高效的分页
直接上代码 DaoImpl: /** * 开发转让页面展示 ,查询搜索数据,而且分页展示 * @param zrdp 搜索条件封装对象 * @return */ @SuppressWarnings(& ...
- n&(n-1)的妙用
今天无聊拿起<编程之美>看了下,发现原来n&(n-1)还有很多妙用.n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:n = 10100(二进 ...
- 谈谈加载(Loading)的那点事
谈谈加载(Loading)的那点事 2013/10/12 | 分类: 设计 | 0 条评论 | 标签: 交互设计, 加载 分享到:33 原文出处: 搜狐焦点 对于加载(loading),想必大家都不陌 ...
- iOS9新特性之新添加的关键字
iOS9 新出的关键字:用来修饰属性,或者方法的参数,返回值 好处:1.迎合swift 2.提高我们开发人员开发规范,减少程序员之间的交流 注意:iOS9新出的的关键字nonnull,nullable ...
- 【BZOJ2400】Spoj 839 Optimal Marks 最小割
[BZOJ2400]Spoj 839 Optimal Marks Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. ...
- error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
1 这个error是什么原因造成的 cmake默认选择的是x86,即32位的生成子. 2 怎么解决这个error 在cmake ..的时候,在后面加上“-G "Visual Studio 1 ...
- netty+Protobuf (整合一)
netty+Protobuf 整合实战 疯狂创客圈 死磕Netty 亿级流量架构系列之12 [博客园 总入口 ] 本文说明 本篇是 netty+Protobuf 整合实战的 第一篇,完成一个 基于Ne ...
- Delphi 7以来的Delphi 2009测试版新语法特性
我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...
- 03-树1 树的同构(25 point(s)) 【Tree】
03-树1 树的同构(25 point(s)) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为 ...