python下对数据库的操作(2) 图片的存取

  • 测试主要对于在数据库数据抓取后,对数据输出类型的处理,对图片的存取

        MYSQL 是支持把图片存入数据库的,也相应的有一个专门的字段 BLOB (Binary Large Object),即较大的二进制对象字段

  • BLOB类型的字段用于存储二进制数据
        MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
        MySQL的四种BLOB类型
        类型 大小(单位:字节)
        TinyBlob 最大 255
        Blob 最大 65K
        MediumBlob 最大 16M
        LongBlob 最大 4G

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

以上两条语句分别创建两个不同大小的BLOB表

测试如下:

#coding:utf-8
#获取版本
import MySQLdb as mdb
import sys

db= None
try:
    db = mdb.connect("localhost","root","chejian","TESTDB")

    cursor = db.cursor()
    cursor.execute("SELECT VERSION()")
    data = cursor.fetchone()
    print "Database version : %s" %(data)
finally:
    if db:
        db.close()

#创建表并插入数据

db = mdb.connect("localhost","root","chejian","TESTDB")

cursor = db.cursor()

try:
    cursor.execute("DROP TABLE IF EXISTS Writers")
    cursor.execute("CREATE TABLE IF NOT EXISTS \
                    Writers(Id INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(25))")
    cursor.execute("INSERT INTO Writers(Name) VALUES('Jack London')")
    cursor.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")
    cursor.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')")
    cursor.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')")
    cursor.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")
    #当对数据库数据改变时,提交到数据库执行
    db.commit()
except:
    #若有错误,则回滚
    db.rollback()
finally:
    if db:
        db.close()

#提取数据 元组

db = mdb.connect("localhost","root","chejian","TESTDB")
cursor = db.cursor()
sql = "SELECT * FROM Writers"
try:
    cursor.execute(sql)
    #获取结果集的条数
    num = int(cursor.rowcount)
    for i in range(num):
        row = cursor.fetchone()
        print  row[0],row[1]
except:
    print "Error: unable to fetcg data"
finally:
    if db:
        db.close()

#使用字典来获取数据

db = mdb.connect("localhost","root","chejian","TESTDB")
cursor = db.cursor(mdb.cursors.DictCursor)
try:
    cursor.execute(sql)
    rows = cursor.fetchall()
    for row in rows:
        print row["Id"],row["Name"]

except:
    print "Error2: unable to fetcg data"
finally:
    if db:
        db.close()

#获取单个表的字段名和信息的方法

db = mdb.connect("localhost","root","chejian","TESTDB")
cursor = db.cursor()
try:
    cursor.execute(sql)
    rows = cursor.fetchall()
    desc = cursor.description
    print 'cur.description :',desc
    for row in rows:
        print row
except:
    print "Error3: unable to fetcg data"
    sys.exit(1)
finally:
    if db:
        db.close()

#查询影响了多少行
db = mdb.connect("localhost","root","chejian","TESTDB")
cursor = db.cursor()
#sql = "UPDATE Writers SET Name = %s WHERE Id = %s" %("Guy de Mau","4")
try:
    cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s" ,("Guy de Mau","4"))
    #cursor.execute(sql)
    db.commit()
    num = int(cursor.rowcount)
    print num
except:
    db.rollback()
    print "Error3: unable to fetcg data"
    sys.exit(1)
finally:
    if db:
        db.close()

#CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);
import MySQLdb as mdb
import sys

try:
# 用读文件模式打开图片
    fin = open("C:\Users\chejian\Pictures\lovewallpaper\9006-106.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='chejian', db='testdb')
# 获取执行 cursor
    cursor = conn.cursor()
# 直接将数据作为字符串,插入数据库
    cursor.execute("INSERT INTO Images SET Data='%s'" %
               mdb.escape_string(img))
# 提交数据
    conn.commit()
#释放资源
    cursor.close()
except mdb.Error, e:
# 若出现异常,打印信息
    conn.rollback()
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)
finally:
    if conn:
        conn.close()


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

对取出来的图片进行查看,发现只有左上角的非常小的一部分,继续测试中

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值