Уведомления

Группа в Telegram: @pythonsu

#1 Июль 17, 2008 10:50:08

Tiranox
От:
Зарегистрирован: 2008-07-17
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

День добрый всем.
Первый раз работаю с модулем 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()



Офлайн

#2 Июль 17, 2008 10:55:20

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

Офлайн

#3 Июль 17, 2008 12:41:53

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

Покажи - как читаешь (вообще - приведи весь код сохранения и чтения)



Офлайн

#4 Июль 17, 2008 13:41:17

Tiranox
От:
Зарегистрирован: 2008-07-17
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

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()



Офлайн

#5 Июль 17, 2008 14:41:53

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

Проверить не могу но вроде должно быть так: l.points = pickle.loads(i)



Офлайн

#6 Июль 17, 2008 15:01:46

Tiranox
От:
Зарегистрирован: 2008-07-17
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

(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’

не получается :(



Офлайн

#7 Июль 17, 2008 15:24:29

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

:)
а просто запиклить и анпиклить твой объект получается (без базы)?



Офлайн

#8 Июль 17, 2008 15:36:19

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

А без сохранения в базу нормально восстанавливает?
l.points = pickle.loads(kk) выполняется без ошибок?



Офлайн

#9 Июль 17, 2008 17:11:43

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

Не поленился, запустил у себя:

# -*- 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, только не забывай очищать базу при экспериментах.



Отредактировано (Июль 17, 2008 17:13:31)

Офлайн

#10 Июль 17, 2008 17:54:44

Tiranox
От:
Зарегистрирован: 2008-07-17
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение tuple с помощью Pickle в sqlite3

Спасибо большое всем. Shiza вам тоже что не поленились :)
Странно другое по совету Viper поставил 0 и получил ошибки а код Shiza. заработал на ура.
А теперь объясните плиз почему именно 0 ?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version