rustavel
Фев. 25, 2011 03:26:57
Я не так давно програмирую и изначально начал большой (для меня) проэкт не зная о базах данных(mysql например) строя всё хранение данных
ч\з словарь и cPickle. Почти его закончил. Всё работает ‘вроде бы’ стабильно. Проэкт может быть запущен в реальную работу(для этого я его и писал). База предпологает хранение и динамическое редактирование данных порядка 3000 человек.
Но возникает вопрос :надёжен ли в моём случае способ хранения словаря как базы данных законсервированым ч\з cPickle или лучше подкорректировать весь код для работы с sqlite3 или с чем либо типа того?
Заранее благодарен!!
igor.kaist
Фев. 25, 2011 12:09:05
Кроме надежности, подумайте еще про производительность.
У вас при сохранении изменений, заново придется пиклить весь словарь и сохранять. Да и все держать в оперативной памяти (не знаю, насколько у вас много данных). Базы данных как то более для этого подходят, ИМХО. Работать с базами данных, достаточно просто.
rustavel
Фев. 25, 2011 14:51:08
Благодарен ещё раз за ответ! Не подскажите где можно найти хорошую документацию на тему sqlite в python с нуля? Искал-не нашел то что нужно! Заранее благодарен!
igor.kaist
Фев. 25, 2011 16:28:38
Официальная документация вполне хороша.
http://docs.python.org/library/sqlite3.htmlДалее смотрите на сам язык запросов sql (если в этом трудности), например здесь:
http://www.intuit.ru/department/database/sql/Все не так сложно, как кажется на первый взгляд. Вам всего то нужно на первое время CREATE TABLE, INSERT, SELECT, DELETE, UPDATE
Андрей Светлов
Фев. 25, 2011 16:57:09
В дополнение к igor.kaist могу сказать, что picke не всегда безболезненно переносятся на новую версию питона. Детали сильно зависят от - оно вам надо?
ZZZ
Фев. 25, 2011 17:06:54
Андрей Светлов
В дополнение к igor.kaist могу сказать, что picke не всегда безболезненно переносятся на новую версию питона.
Хм… А с этого места можно подробнее?
Например, я использую ZODB, которая хранит внутри себя пиклы объектов. Могут быть проблемы чтения одной базы разными версиями питона?
Или я чего-то не так понял?
rustavel
Фев. 25, 2011 17:16:44
igor.kaist, при много спасиб! То что нужно!
Андрей Светлов
Фев. 25, 2011 17:40:30
ZZZ, подробней.
Pickle использует на сегодня три протокола, насколько я помню.
Текстовый (совместимый со всеми), бинарный старый и бинарный новый.
Так вот, бинарные основываются на marshal, который зависит от версии питона.
Вроде бы как сохранение простых объектов (int, str, tuple, list, dict) не приводило к неприятностям.
Неделю назад в рассылке python-dev увидел, что “простой” pickle из 2.7 не понимается 3.2.
В детали не вникал. Если нужно - прочитаю еще раз, более внимательно всю ветку.
Там, кажется, ломались строки - они начинали восприниматься как двухбайтный юникод с ожидаемыми последствиями.
Что будет дальше и влияет ли на 3.1 - не вникал. Будут держать обратную совместимость или объявят баг фичей - не знаю.
Проблема есть только с тройкой.
ZZZ
Фев. 25, 2011 18:19:56
Хм… А я всегда думал, что marshal один везде… Наверное, что-то упустил.
Спасибо за разъяснение, буду иметь в виду и не буду сильно удивляться в случае проблем.
Андрей Светлов
В детали не вникал. Если нужно - прочитаю еще раз, более внимательно всю ветку.
Да нет, не надо. Думаю, что если мне понадобиться, я буду знать где искать. :-)
Андрей Светлов
Фев. 25, 2011 18:25:36
Нет. Как раз marshal в общем виде различается от версии к версии.
Именно поэтому .pyc для каждой версии питона разные - они представляют простой marshal кода модуля с заголовком в виде timestamp - ничего более.
Способ сохранения простых типов не меняется обычно - но Питон этому правилу старается следовать, не обещая ничего.