Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 12.03.2019
Сообщений: 7

Изменения в записях бд (shelve) и запуск модулей как самостоятельных сценариев

12.03.2019, 20:17. Показов 2726. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый! Начал постигать Python. Не дают покоя два вопроса:
1.
Python
1
2
3
4
5
6
7
8
import shelve 
object = someClass(name, age) 
dbase = shelve.open(‘filename’) 
dbase[‘key’] = object
record=dbase[‘key’] 
#Изменения в record атрибутов name и age
dbase[‘key’]=record
dbase.close()
Так все работает и сохраняет изменения в бд.
Но не сохраняет изменения, если вместо использования кода:
Python
1
2
3
record=dbase[‘key’] 
#Изменения в record атрибутов name и age
dbase[‘key’]=record
вставить setattr(dbase[‘key’],'name','Ivan') или dbase[‘key’].name='Ivan'. Ошибок не выдает.
print(record, dbase[‘key’]) выводит, что оба объекта являются экземплярами клaсса someClass.
Зачем использовать переменную record? И почему без данных присваиваний не сохраняет изменения, если по сути это обычные экземпляры?

2. Есть файл создания бд:
Python
1
2
3
4
5
6
7
8
9
10
11
import shelve
from person import Person
from manager import Manager
bob = Person(‘Bob Smith’, 42, 30000, ‘software’)
sue = Person(‘Sue Jones’, 45, 40000, ‘hardware’)
tom = Manager(‘Tom Doe’, 50, 50000)
db = shelve.open(‘class-shelve)
db[‘bob’] = bob
db[‘sue’] = sue
db[‘tom’] = tom
db.close()
Сам файл и person.py, manager.py находятся в одной папке. Папка не прописана в PATH.
Запуская в IDLE все работает и создается бд. Если запускать сам файл, то ничего не происходит(нет ошибок и нет бд). Кто-нибудь может пояснить почему?
Ведь другие модули должны быть видны друг-другу, если находятся в одной папке с запускаемым модулем.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.03.2019, 20:17
Ответы с готовыми решениями:

Запуск модулей и сценариев .py через командную сроку (windows)
Приветствую! Начал знакомство с Python по книге М. Лутца "Изучаем Python 4 изд.". В одном из заданий к главе, есть следующий...

Запуск сценариев в Outlook
Здравствуйте! Надо сохранять вложения из почты и с помощью скрипта на VBA их обрабатывать. Это все прекрасно работало на Win 7 + Outlook...

Крайние приключения. Выводы. И как я нарвался на самостоятельных женщин. Кто что скажет ?
В общем тут такие темы. Мне интересно. Аж захотелось немного свои секреты приоткрыть. Так, для того что бы мнения услышать. Бывает, люди...

7
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.03.2019, 20:25
А почему используете имя файла вместо точного пути?
0
0 / 0 / 0
Регистрация: 12.03.2019
Сообщений: 7
12.03.2019, 20:33  [ТС]
Я думал это не обязательно, когда все файлы находятся в одной папке и из который и происходит запуск. Запуская в Idle все работает. Даже у Луца вроде как написано, что первое место, где питон ищет указанные в сценарии модули - это в папке запуске и дочерних папках.

Уточнения на первый вопрос, а то редактировать уже не позволяет:
Python
1
2
3
4
5
6
7
8
import shelve 
object = someClass(name, age) 
dbase = shelve.open(‘filename’) 
dbase[‘key’] = object
record=dbase[‘key’] 
setattr(record,'name','Ivan')
dbase[‘key’]=record
dbase.close()
т.е. используя record в setattr все работает, избавляясь от record и используя только setattr(dbase[‘key’],'name','Ivan') - не сохраняет.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.03.2019, 21:40
Цитата Сообщение от Dmitr062 Посмотреть сообщение
используя record в setattr все работает
Работает только потому, что вы после этого перезаписываете ключ (в record на этот момент хранится измененная копия вашего объекта):dbase[‘key’]=record
А иначе - и не должно было работать.

P.S. Но если очень надо - используйте writeback=True.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
13.03.2019, 13:07
Лучший ответ Сообщение было отмечено Dmitr062 как решение

Решение

Цитата Сообщение от Garry Galler Посмотреть сообщение
Работает только потому, что вы после этого перезаписываете ключ (в record на этот момент хранится измененная копия вашего объекта):dbase[‘key’]=record
А иначе - и не должно было работать.
Garry Galler, Вам все правильно сказал.
От себя добавлю, почему, как я думаю, во втором случае не происходит перезаписи новых данных в БД.
Цитата Сообщение от Dmitr062 Посмотреть сообщение
setattr(dbase[‘key’],'name','Ivan') или dbase[‘key’].name='Ivan'
dbase[‘key’] считывает запись из базы данных (база данных кстати является словарем) и затем в считанной записи dbase[‘key’].name='Ivan' заменяет значение атрибута name. И все, а собственно занесение этой записи в БД не происходит, все изменения остаются только в оперативной памяти компьютера. Для того, что бы записать изменения в БД, нужно было присвоить ссылку на извлеченную из БД запись какой либо переменной, например record=dbase[‘key’], и после внесенных изменений записать эту запись в базу данных dbase[‘key’]=record.
Итак, во втором случае Вы извлекаете запись из БД, при этом не присваивая ее ни какой переменной, вностие в извлеченную запись изменения, а записи ее назад в БД у Вас нет. Вы не можете это сделать, так как Вы не присвоили извлеченную запись никакой переменной, она осталась у Вас безымянной и Вы не можете с ней работать, что бы записать ее назад в БД.
0
0 / 0 / 0
Регистрация: 12.03.2019
Сообщений: 7
13.03.2019, 20:13  [ТС]
Спасибо за развернутый ответ. Немного стало ясней)

А по второму вопросу вы можете так же развернуто и понятно пояснить? Буду Вам признателен.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
13.03.2019, 23:51
Dmitr062, По второму вопросу не могу ничего сказать не видя файлов.
Но могу Вам дать один совет, который вам в данном случае пригодиться.
При работе с базой данных (БД) используя модуль shelve, когда Вы заносите в БД экземпляры классов, нельзя после заполнения БД переносить в другое место файлы , содержащие классы, к которым принадлежат занесенные в БД экземпляры. Потому, что после извлечения экземпляров из БД они в этом случае перестают быть экземплярами классов и теряют все свои атрибуты. То есть структура папок и расположение файлов должны оставаться неизменными. Я с этим столкнулся но как следует этот вопрос не изучил. Может его можно решить указывая расположение файлов питону различными его средствами. Но будьте к этому готовы.

Добавлено через 1 час 2 минуты
Dmitr062, Поэкспериментировал со вторым вопросом. Я учил по Лутцу и у меня остались модули с классами Person и Manager я поместил их в в ту же папку, куда сохранил Ваш файл. Запустил отладчиком из среды разработки. Файлы БД создаются. Запустил файл непосредственно из папки, с помощью python. Файлы БД не создаются. Так как окно Командной строки после отработки программы питон автоматически закрывает, я поместил в конец кода input('STOP'), что бы окно не закрывалось и посмотреть ход выполнения. Запустил из папки. И о чудеса, файлы БД создались. Закоментировал input('STOP') , но файлы БД все равно теперь создаются. Чудеса. Попробуйте повторить.
Python
1
2
3
4
5
6
7
8
9
10
11
12
import shelve
from person import Person
from manager import Manager
bob = Person('Bob Smith', 42, 30000, 'software')
sue = Person('Sue Jones', 45, 40000, 'hardware')
tom = Manager('Tom Doe', 50, 50000)
db = shelve.open('class-shelve')
db['bob'] = bob
db['sue'] = sue
db['tom'] = tom
db.close()
input('STOP')
Добавлено через 4 минуты
Dmitr062, Кстати, сюда Вы скопировали код из книги, пришлось заменять типографские кавычки на питоновские. После этого код заработал..
0
0 / 0 / 0
Регистрация: 12.03.2019
Сообщений: 7
14.03.2019, 20:27  [ТС]
Спасибо! Про кавычки я в курсе. Пробовал использовать input тоже. Но оказалось все немного иначе. *.py открывает у меня с помощью блокнота. Для запуска сценария создания БД я использовал "открыть с помощью...". Когда в свойствах поменял открытие именно на python то заработало.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2019, 20:27
Помогаю со студенческими работами здесь

Упорядочить нечетные элементы массива по возрастанию их модулей, четные оставить без изменения
Нужна помощь с заданием! написать на ассемблере! Ввести количество элементов массива. Ввести с клавиатуры одномерный целочисленный...

Разборка JS сценариев, нужен совет как доработать
Здравствуйте, товарищи. Тут вот какое дело у меня вышло. делал я для сайта такую штуковину Добавление новости... суть: Есть страница...

Shelve
как сделать перевод с Русского на анлийский с помощью Shalve?

Размещение самостоятельных разделов
На сайте создаю дополнительно несколько крупных разделов, раскрывающих тематику основного. Разделы имеют самостоятельную структуру и...

Разделите пожалуйста программу на 3 самостоятельных.
Разделите пожалуйста программу на 3 самостоятельных. Программа. program sposob_zadania; uses crt; const n=100;m=100; var...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru