文档章节

【数据库】python 数据库操作

mickelfeng
 mickelfeng
发布于 2017/03/17 14:00
字数 2946
阅读 27
收藏 0

目前python操作MySQL数据库的库有两个,一个是MySQLdb  还有SQLAlchemy

python使用mysql数据库

  然而,2016年开始,我从Python2切换到了Python3,Python2已经基本不再使用,MySQLdb驱动从2014年1月停止了维护。所以,打算重新再来写这篇博客。

  • Python2 ---> Python3
  • MySQLdb --> PyMySQL

MySQLdb

在Windows平台上安装mysql模块用于Python开发

http://www.codegood.com/downloads

用python连接mysql的时候,需要用的安装版本,源码版本容易有错误提示。下边是打包了32与64版本。 
MySQL-python-1.2.3.win32-py2.7.exe 
MySQL-python-1.2.3.win-amd64-py2.7.exe

 

使用Python访问MySQL,需要一系列安装

 

Linux下MySQLdb安装见  

Python MySQLdb在Linux下的快速安装

http://blog.csdn.net/wklken/article/details/7271019

-------------------------------------------------------------

以下是windows环境下的:

1.      安装数据库mysql

下载地址:http://www.mysql.com/downloads/

可以顺带装个图形工具,我用的是MySQL-Front

2.      安装MySQLdb

好了,到了这一步,你有两个选择

A.     安装已编译好的版本(一分钟)

B.     从官网下,自己编译安装(介个…..半小时到半天不等,取决于你的系统环境以及RP)

若是系统32位的,有c++编译环境的,自认为RP不错的,可以选择自己编译安装,当然,遇到问题还是难免的,一步步搞还是能搞出来的

若是系统64位的,啥都木有的,建议下编译版本的,甭折腾

2.1安装已编译版本:

http://www.codegood.com/downloads

根据自己系统下载,双击安装,搞定

然后import MySQLdb,查看是否成功

 

我的,win7,64位,2.7版本

MySQL-python-1.2.3.win-amd64-py2.7.exe

2.2自己编译安装

话说搞现成的和自己编译差距不一一点半点的,特别是64位win7,搞死了

2.2.1安装setuptools

在安装MySQLdb之前必须安装setuptools,要不然会出现编译错误

http://pypi.python.org/pypi/setuptools

http://peak.telecommunity.com/dist/ez_setup.py 使用这个安装(64位系统必须用这个)

2.2.2安装MySQLdb

下载MySQLdb

http://sourceforge.net/projects/mysql-python/

解压后,cmd进入对应文件夹

如果32位系统且有gcc编译环境,直接

python setup.py build

2.2.3问题汇总

A. 64位系统,无法读取注册表的问题

异常信息如下:

F:\devtools\MySQL-python-1.2.3>pythonsetup.py build

Traceback (most recent call last):

 File "setup.py", line 15, in <module>

   metadata, options = get_config()

 File "F:\devtools\MySQL-python-1.2.3\setup_windows.py", line7, in get_config

   serverKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, options[' registry_ke

y'] )

WindowsError: [Error 2] The system cannotfind the file specified

 

解决方法:

其实分析代码,发现只是寻找mysql的安装地址而已  修改setup_windows.py如下

注解两行,加入一行,为第一步mysql的安装位置

 

   #serverKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,options['registry_key'] )

   #mysql_root, dummy = _winreg.QueryValueEx(serverKey,'Location')

   mysql_root = r"F:\devtools\MySQL\MySQL Server 5.5"

 

B.没有gcc编译环境

unable to find vcvarsall.bat

解决方法:安装编译环境(一个老外的帖子)

1)  First ofall download MinGW. Youneed g++compiler and MingW make in setup.

2)  If youinstalled MinGW for example to “C:\MinGW” then add “C:\MinGW\bin”to your PATH in Windows.(安装路径加入环境变量)

3)  Now startyour Command Prompt and Go the directory where you have your setup.py residing.

4)  Last andmost important step:

setup.py install build --compiler=mingw32

或者在setup.cfg中加入:
[build]
    compiler = mingw32

 

C.gcc: /Zl: No suchfile or directory错误

异常信息如下

F:\devtools\MinGW\bin\gcc.exe -mno-cygwin-mdll -O -Wall -Dversion_info=(1,2,3,'

final',0) -D__version__=1.2.3"-IF:\devtools\MySQL\MySQL Server 5.5\include" -IC

:\Python27\include -IC:\Python27\PC -c_mysql.c -o build\temp.win-amd64-2.7\Rele

ase\_mysql.o /Zl

gcc: error: /Zl: No such file or directory

error: command 'gcc' failed with exitstatus 1

参数是vc特有的编译参数,如果使用mingw的话因为是gcc所以不支持。可以在setup_windows.py中去掉
/Zl  

解决方法:

修改setup_windows.py  改为空的

#extra_compile_args = [ '/Zl' ]

    extra_compile_args = [ '' ]

 目前就遇到这几个问题,望补充

3.  增删改查代码示例及结果(just for test)

CREATE TABLE `user` (  
  `Id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(255) DEFAULT NULL,  
  `age` varchar(255) DEFAULT NULL,  
  PRIMARY KEY (`Id`)  
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;  
#-*- coding:utf-8 -*-  
#dbtest.py  
#just used for a mysql test  
''''' 
Created on 2012-2-12 

@author: ken 
'''  
#mysqldb      
import time, MySQLdb, sys    
         
#connect   
conn=MySQLdb.connect(host="localhost",user="root",passwd="test_pwd",db="school",charset="utf8")    
cursor = conn.cursor()      
         
#add  
sql = "insert into user(name,age) values(%s,%s)"     
param = ("tom",str(20))      
n = cursor.execute(sql,param)      
print n      
         
#更新      
sql = "update user set name=%s where Id=9001"     
param = ("ken")      
n = cursor.execute(sql,param)      
print n      
  
#查询      
n = cursor.execute("select * from user")      
for row in cursor.fetchall():      
    for r in row:      
        print r,     
print ""  
  
  
#删除      
sql = "delete from user where name=%s"     
param =("ted")      
n = cursor.execute(sql,param)      
print n      
cursor.close()      
         
#关闭      
conn.close()  


实例 1、取得 MYSQL 的版本

# -*- coding: UTF-8 -*-
#安装 MYSQL DB for python
import MySQLdb as mdb
con = None
try:
  #连接 mysql 的方法: connect('ip','user','password','dbname')
  con = mdb.connect('localhost', 'root','root', 'test');
 
  #所有的查询,都在连接 con 的一个模块 cursor 上面运行的
  cur = con.cursor()
 
  #执行一个查询
  cur.execute("SELECT VERSION()")
  #取得上个查询的结果,是单个结果
 
  data = cur.fetchone()
  print "Database version : %s " % data
finally:
  if con:
    #无论如何,连接记得关闭
    con.close()

实例 2、创建一个表并且插入数据

import MySQLdb as mdb
import sys
 
#将 con 设定为全局连接
con = mdb.connect('localhost', 'root', 'root', 'test');
with con:
 
#获取连接的 cursor,只有获取了 cursor,我们才能进行各种操作
cur = con.cursor()
 
#创建一个数据表 writers(id,name)
cur.execute("CREATE TABLE IF NOT EXISTS \
Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))")
 
#以下插入了 5 条数据
cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')")
cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")
cur.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')")
cur.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')")
cur.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")


实例 3、 python 使用 select 获取 mysql 的数据并遍历

import MySQLdb as mdb
import sys
 
#连接 mysql,获取连接的对象
con = mdb.connect('localhost', 'root', 'root', 'test');
with con:
 
#仍然是,第一步要获取连接的 cursor 对象,用于执行查询
cur = con.cursor()
 
#类似于其他语言的 query 函数, execute 是 python 中的执行查询函数
cur.execute("SELECT * FROM Writers")
 
#使用 fetchall 函数,将结果集(多维元组)存入 rows 里面
rows = cur.fetchall()
 
#依次遍历结果集,发现每个元素,就是表中的一条记录,用一个元组来显示
for row in rows:
print row

运行结果:

(1L, ‘Jack London')
(2L, ‘Honore de Balzac')
(3L, ‘Lion Feuchtwanger')
(4L, ‘Emile Zola')
(5L, ‘Truman Capote')
上面的代码,用来将所有的结果取出,不过打印的时候是每行一个元祖打印,现在我们使用方法,取出其中的单个数据:

import MySQLdb as mdb
import sys
 
#获取 mysql 的链接对象
con = mdb.connect('localhost', 'root', 'root', 'test');
with con:
#获取执行查询的对象
cur = con.cursor()
#执行那个查询,这里用的是 select 语句
cur.execute("SELECT * FROM Writers")
#使用 cur.rowcount 获取结果集的条数
numrows = int(cur.rowcount)
#循环 numrows 次,每次取出一行数据
for i in range(numrows):
#每次取出一行,放到 row 中,这是一个元组(id,name)
row = cur.fetchone()
#直接输出两个元素
print row[0], row[1]

运行结果:

1 Jack London
2 Honore de Balzac
3 Lion Feuchtwanger
4 Emile Zola
5 Truman Capote
实例 4、使用字典 cursor 取得结果集(可以使用表字段名字访问值)

import MySQLdb as mdb
import sys
#获得 mysql 查询的链接对象
con = mdb.connect('localhost', 'root', 'root', 'test')
with con:
#获取连接上的字典 cursor,注意获取的方法,
#每一个 cursor 其实都是 cursor 的子类
cur = con.cursor(mdb.cursors.DictCursor)
#执行语句不变
cur.execute("SELECT * FROM Writers")
#获取数据方法不变
rows = cur.fetchall()
#遍历数据也不变(比上一个更直接一点)
for row in rows:
#这里,可以使用键值对的方法,由键名字来获取数据
print "%s %s" % (row["Id"], row["Name"])

实例 5、获取单个表的字段名和信息的方法

import MySQLdb as mdb
import sys
#获取数据库的链接对象
con = mdb.connect('localhost', 'root', 'root', 'test')
with con:
#获取普通的查询 cursor
cur = con.cursor()
cur.execute("SELECT * FROM Writers")
rows = cur.fetchall()
#获取连接对象的描述信息
desc = cur.description
print 'cur.description:',desc
#打印表头,就是字段名字
print "%s %3s" % (desc[0][0], desc[1][0])
for row in rows:
#打印结果
print "%2s %3s" % row

运行结果:

cur.description: ((‘Id', 3, 1, 11, 11, 0, 0), (‘Name', 253, 17, 25, 25, 0, 1))
Id Name
1 Jack London
2 Honore de Balzac
3 Lion Feuchtwanger
4 Emile Zola
5 Truman Capote
实例 6、使用 Prepared statements 执行查询(更安全方便)

import MySQLdb as mdb
import sys
 
con = mdb.connect('localhost', 'root', 'root', 'test')
with con:
cur = con.cursor()
#我们看到,这里可以通过写一个可以组装的 sql 语句来进行
cur.execute("UPDATE Writers SET Name = %s WHERE Id = %s",
("Guy de Maupasant", "4"))
#使用 cur.rowcount 获取影响了多少行
print "Number of rows updated: %d" % cur.rowcount

结果:
Number of rows updated: 1

实例 7、把图片用二进制存入 MYSQL

有人喜欢把图片存入 MYSQL(这种做法貌似很少吧),我看大部分的程序,图片都是存放在服务器上的文件,数据库中存的只是图片的地址而已,不过 MYSQL 是支持把图片存入数据库的,也相应的有一个专门的字段 BLOB (Binary Large Object),即较大的二进制对象字段,请看如下程序,注意测试图片自己随便找一个,地址要正确: 
首先,在数据库中创建一个表,用于存放图片:

复制代码代码如下:

CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);

然后运行如下 PYTHON 代码进行:

import MySQLdb as mdb
import sys
 
try:
#用读文件模式打开图片
fin = open("../web.jpg")
#将文本读入 img 对象中
img = fin.read()
#关闭文件
fin.close()
except IOError, e:
#如果出错,打印错误信息
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
try:
#链接 mysql,获取对象
conn = mdb.connect(host='localhost',user='root',passwd='root',
db='test')
#获取执行 cursor
cursor = conn.cursor()
#直接将数据作为字符串,插入数据库
cursor.execute("INSERT INTO Images SET Data='%s'" %
mdb.escape_string(img))
#提交数据
conn.commit()
#提交之后,再关闭 cursor 和链接
cursor.close()
conn.close()
except mdb.Error, e:
#若出现异常,打印信息
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)

 

实例 8、从数据库中把图片读出来

import MySQLdb as mdb
import sys
 
try:
#连接 mysql,获取连接的对象
conn = mdb.connect('localhost', 'root', 'root', 'test');
cursor = conn.cursor()
#执行查询该图片字段的 SQL
cursor.execute("SELECT Data FROM Images LIMIT 1")
#使用二进制写文件的方法,打开一个图片文件,若不存在则自动创建
fout = open('image.png','wb')
#直接将数据如文件
fout.write(cursor.fetchone()[0])
#关闭写入的文件
fout.close()
#释放查询数据的资源
cursor.close()
conn.close()
except IOError, e:
#捕获 IO 的异常 ,主要是文件写入会发生错误
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)


实例 9、使用 Transaction 即事务(手动提交,自动回滚)

import MySQLdb as mdb
import sys
 
try:
#连接 mysql,获取连接的对象
conn = mdb.connect('localhost', 'root', 'root', 'test');
cursor = conn.cursor()
#如果某个数据库支持事务,会自动开启
#这里用的是 MYSQL,所以会自动开启事务(若是 MYISM 引擎则不会)
cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s",
("Leo Tolstoy", "1"))
cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s",
("Boris Pasternak", "2"))
cursor.execute("UPDATE Writer SET Name = %s WHERE Id = %s",
("Leonid Leonov", "3"))
#事务的特性 1、原子性的手动提交
conn.commit()
cursor.close()
conn.close()
except mdb.Error, e:
#如果出现了错误,那么可以回滚,就是上面的三条语句要么执行,要么都不执行
conn.rollback()
print "Error %d: %s" % (e.args[0],e.args[1])


结果: 
1、因为不存在 writer 表( SQL 第三条语句),所以出现错误:Error 1146: Table ‘test.writer' doesn't exist 
2、出现错误,出发异常处理, 3 条语句的前两条会自动变成了没有执行,结果不变 
3、如果本代码放到一个 MyISAM 引擎表,前两句会执行,第三句不会;如果是 INNDB 引擎,则都不会执行。

SQLAlchemy

使用SQLAlchemy - 廖雪峰的官方网站

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000

官方使用手册:

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html

自己写的注册号入库:

#coding:utf-8

letters=[chr(x) for x in range(97,123)]

from random import random,sample,randint

numbers=[str(i) for i in range(0,9)]

staff=letters+numbers



from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,Column, Integer, String

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class T(Base):
    __tablename__ = 't'
    id = Column(Integer, primary_key=True)
    code = Column(String(20))

# 初始化数据库连接:
engine = create_engine('mysql+mysqldb://root:root@localhost:3306/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

session=DBSession() # 很怪呢

for i in range(200):
   tmp=sample(staff,20)
   papa="".join(tmp)

   data = T(code=papa)
   session.add(data)
   session.commit()

 

© 著作权归作者所有

mickelfeng

mickelfeng

粉丝 237
博文 2802
码字总数 604377
作品 0
成都
高级程序员
私信 提问
Python操作Access数据库基本操作步骤分析

我们在这篇文章中公分了五个步骤详细分析了Python操作Access数据库的相关方法,希望可以给又需要的朋友们带来一些帮助。 AD: Python编程语言的出现,带给开发人员非常大的好处。我们可以利用...

张卫泉
2012/07/01
3K
0
大数据分析挖掘学习方向?数据分析师的就业前景怎么样?

加米谷数据分析挖掘课程明细,从理论到云端实操环境到项目实战,手把手教您从0掌握数据分析与挖掘技术,带您走进数据时代。 第一阶段(python基础) python入门:1、Python版本特性介绍2、P...

加米谷大数据
2018/04/17
25
0
Python操作Mysql

首先,安装需要的环境,Mysql和Python就不说了,必备的东西。 主要是安装的MySQLdb,可以去sf.net下载,具体地址是http://sourceforge.net/projects/mysql-python/ 如果用Ubuntu,直接 sudo...

durban
2012/05/25
194
2
Python数据库编程入门教程

这年头,还拿打印"Hello World"做教程?毛主席说了,你这不是耍流氓么!这个时代,数据库是王道!今天,我就用一个简单实用的销售数据库开发案例来引导感兴趣的读者入门Python数据库编程技术...

派派技术小组
2013/02/05
928
0
Python接口测试之对MySQL的操作

文章主要来说python对mysql数据库的基本操作,当然,前提是已经搭建了python环境和搭建了Mysql数据库的环境,python操作mysql数据库提供了MySQLdb库. 这里,我们详细的介绍对python对mysql的...

急速奔跑中的蜗牛
06/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

高速PCB设计软件allegro中与网络有关的约束规则设置

在allegro pcb的设计过程中,设计约束规则包括时序规则、间距规则、信号完整性规则以及物理规则等,本期主要详细讲解与物理、间距与电气约束中的线宽、线间距物理规则的设置。 一、线宽设置 ...

demyar
21分钟前
2
0
Linux 启动停止SpringBoot jar 程序部署Shell 脚本

#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=algorithm.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]...

草庐过客
23分钟前
3
0
mysql-connector-java驱动升级到8.0后数据库保存时间出现时差

1.问题:在一个新项目中用到了新版的mysql jdbc 驱动后,发现保存到数据库的时间出现了时差 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>......

ValSong
24分钟前
3
0
好程序员大数据教程Scala系列之隐式转换和隐式参数

5.1. 概念 隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。 5.2. 作用 隐式的对类的方法进行增强...

好程序员官网
28分钟前
3
0
多线程必备

初次接触线程,可能有很多初学者搞不明白,始终云里雾里,那么本篇文章直接带大家介绍多线程必须知道的几个点 接下来没有多余,直接上干货 1. 进程和线程的区别是什么? 进程是执行着的应用程序,...

理性思考
31分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部