Tiranox
Июль 17, 2008 10:50:08
День добрый всем.
Первый раз работаю с модулем pickle.
Задача: сохранить tuple в бинарном виде в BLOB поле базу sqlite3 и прочесть его обратно.
Запись вроде асилил, при чтении ошибка: expected read buffer, tuple found
Поменял на текстовый формат (False в dumps) все равно не получается.
Помогите разобраться плиз.
import Object
import sqlite3 as db
import pickle
k = Object(2)
k.points.append((10, 20))
k.points.append((100, 20))
k.points.append((100, 100))
k.points.append((10, 100))
k.points.append((10, 20))
c = db.connect(database=“test.sqlite”)
cu = c.cursor()
kk = pickle.dumps(k.points,True)
cu.execute(“insert into objects ( iid, objdata) values (7,?)” , (db.Binary(kk),))
#cu.execute(“insert into objects ( iid, objdata) values (8,?)” , (kk,))
c.commit()
c.close()
crchemist
Июль 17, 2008 10:55:20
shiza
Июль 17, 2008 12:41:53
Покажи - как читаешь (вообще - приведи весь код сохранения и чтения)
Tiranox
Июль 17, 2008 13:41:17
import Object
import sqlite3 as db
import pickle
k = MapObject(2)
l = MapObject(3)
k.points.append((10, 20))
k.points.append((100, 20))
k.points.append((100, 100))
k.points.append((10, 100))
k.points.append((10, 20))
#print k.points
c = db.connect(database=“test.sqlite”)
cu = c.cursor()
#print i
#print type (i)
#запись
kk = pickle.dumps(k.points,True)
cu.execute(“insert into objects ( iid, objdata) values (10,?)” , (db.Binary(kk),))
# objdata - blob
#чтение
cu.execute(“SELECT objdata FROM objects where iid = 10”)
for i in cu.fetchall():
print i
l.points = pickle.loads(i) #здесь ступор
print l.points
c.commit()
c.close()
Viper
Июль 17, 2008 14:41:53
Проверить не могу но вроде должно быть так: l.points = pickle.loads(i)
Tiranox
Июль 17, 2008 15:01:46
(u'(lp0\n(I10\nI20\ntp1\na(I100\nI20\ntp2\na(I100\nI100\ntp3\na(I10\nI100\ntp4\n
a(I10\nI20\ntp5\na.',)
<type ‘tuple’>
Traceback (most recent call last):
File “I:\map_pr3\0\test2.py”, line 31, in <module>
l.points = pickle.loads(i)
File “C:\Python25\lib\pickle.py”, line 1374, in loads
return Unpickler(file).load()
File “C:\Python25\lib\pickle.py”, line 858, in load
dispatch(self)
KeyError: ‘\x00’
не получается :(
ofigetitelno
Июль 17, 2008 15:24:29
:)
а просто запиклить и анпиклить твой объект получается (без базы)?
Viper
Июль 17, 2008 15:36:19
А без сохранения в базу нормально восстанавливает?
l.points = pickle.loads(kk) выполняется без ошибок?
shiza
Июль 17, 2008 17:11:43
Не поленился, запустил у себя:
# -*- coding: UTF8 -*-
#import Object
import sqlite3 as db
import pickle
class MapObject:
def __init__(self, d):
self.points = []
k = MapObject(2)
l = MapObject(3)
k.points.append((10, 20))
k.points.append((100, 20))
k.points.append((100, 100))
k.points.append((10, 100))
k.points.append((10, 20))
#print k.points
c = db.connect(database="test.sqlite")
cu = c.cursor()
#print i
#print type (i)
#запись
kk = pickle.dumps(k.points,True)
cu.execute("insert into objects ( iid, objdata) values (10,?)" , (db.Binary(kk),))
# objdata - blob
#чтение
cu.execute("SELECT objdata FROM objects where iid = 10")
for i in cu.fetchall():
print i
l.points = pickle.loads(i[0]) # i -> ip[0]
print l.points
c.commit()
c.close()
В общем дело было в i, только не забывай очищать базу при экспериментах.
Tiranox
Июль 17, 2008 17:54:44
Спасибо большое всем. Shiza вам тоже что не поленились :)
Странно другое по совету Viper поставил 0 и получил ошибки а код Shiza. заработал на ура.
А теперь объясните плиз почему именно 0 ?