Найти - Пользователи
Полная версия: сохранение tuple с помощью Pickle в sqlite3
Начало » Базы данных » сохранение tuple с помощью Pickle в sqlite3
1 2
Tiranox
День добрый всем.
Первый раз работаю с модулем 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
може поможе http://www.python.org/doc/2.4.1/lib/pickle-protocol.html
shiza
Покажи - как читаешь (вообще - приведи весь код сохранения и чтения)
Tiranox
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
Проверить не могу но вроде должно быть так: l.points = pickle.loads(i)
Tiranox
(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
:)
а просто запиклить и анпиклить твой объект получается (без базы)?
Viper
А без сохранения в базу нормально восстанавливает?
l.points = pickle.loads(kk) выполняется без ошибок?
shiza
Не поленился, запустил у себя:

# -*- 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
Спасибо большое всем. Shiza вам тоже что не поленились :)
Странно другое по совету Viper поставил 0 и получил ошибки а код Shiza. заработал на ура.
А теперь объясните плиз почему именно 0 ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB