#python #sqlite #sql-update
#python #sqlite #sql-обновление
Вопрос:
Я очень новичок в SQLite, python и программировании в целом и пытаюсь создать базу данных домашнего медиа-сервера. Я пытаюсь написать программу, которая добавит новые записи в созданную мной базу данных и позволит мне также редактировать существующие записи. Хотя я могу добавлять записи просто отлично, обновление определенных записей — это другое дело. В качестве примера я хотел бы иметь возможность обновлять определенное название фильма на новое, не зная, какой идентификатор у него есть. Раздел кода в моей программе, который вызывает проблемы, — это:
def editMedia():
while True:
print('Catagories: title, genre, type, director, length, rating')
editValue = input('What would like to edit?: ')
if editValue not in ('title', 'Title', 'genre', 'Genre', 'type',
'Type', 'director', 'Director', 'length', 'Length',
'rating', 'Rating'):
print('Invalid entry: Please choose one of the catagories')
continue
elif editValue in ('title', 'Title'):
while True:
oldTitle = input('Enter old title: ')
if len(oldTitle) < 1:
print('Invalid entry: Old title must have a value.')
continue
else:
while True:
updateTitle = input('Enter new title: ')
if len(updateTitle) < 1:
print('Invalid entry: New title must have a value.')
continue
else:
break
break
cur.execute('''UPDATE Movie SET title = ? WHERE title = ?''', (updateTitle, oldTitle))
print("Record Updated successfully ")
break
conn.commit()
Код, который я использовал для создания таблиц, которые я редактирую, это:
import sqlite3
conn = sqlite3.connect('mediadb.sqlite')
cur = conn.cursor()
cur.executescript('''
DROP TABLE IF EXISTS Director;
DROP TABLE IF EXISTS Genre;
DROP TABLE IF EXISTS Type;
DROP TABLE IF EXISTS Movie;
CREATE TABLE Director (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE);
CREATE TABLE Genre (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE);
CREATE TABLE Type (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE);
CREATE TABLE Movie (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
title TEXT UNIQUE,
genre_id INTEGER,
type_id INTEGER,
director_id INTEGER,
minutes INTEGER, rating INTEGER);
''')
conn.commit()
cur.close()
Когда я пытаюсь обновить определенное название фильма, программа запускается без ошибок, но когда я использую DB Browser для SQLite для проверки моей базы данных, чтобы подтвердить, что название было обновлено, я обнаруживаю, что ничего не изменилось.
Что я здесь делаю не так? Возможно ли то, что мне нужно?
Ответ №1:
Я только что запустил это на своем ноутбуке и вижу, что у вас есть несколько проблем. Также возможно множество улучшений, но я уверен, что это придет со временем, когда ваши навыки улучшатся
Я поторопился с некоторыми основными изменениями, но это работает, и я объясню свои выводы ниже
def editMedia():
while True:
print('Catagories: title, genre, type, director, length, rating')
editValue = input('What would like to edit?: ').lower()
if editValue not in ('title', 'genre', 'type', 'director', 'length', 'rating'):
print('Invalid entry: Please choose one of the catagories')
continue
elif editValue == 'title':
while True:
oldTitle = input('Enter old title: ')
if len(oldTitle) < 1:
print('Invalid entry: Old title must have a value.')
continue
else:
while True:
updateTitle = input('Enter new title: ')
if len(updateTitle) < 1:
print('Invalid entry: New title must have a value.')
continue
else:
break
conn = sqlite3.connect('mediadb.sqlite')
cur = conn.cursor()
cur.execute('''UPDATE Movie SET title = ? WHERE title = ?''', (updateTitle, oldTitle))
cur.close()
conn.commit()
print("Record Updated successfully ")
break
break
- Вызов lower() при вводе пользователями того, что они пытаются отредактировать, означает, что вам не нужно беспокоиться о заглавных буквах
- Вы вызывали break перед вашей командой обновления, поэтому скрипт никогда не попадал туда
- Даже после исправления этого вы пытались выполнить команду для закрытого курсора, которая выдает ошибку программирования; Я снова открываю ее для вас, затем запускаю команду обновления, затем закрываю и фиксирую
Комментарии:
1. Большое вам спасибо за вашу помощь! Сейчас у меня все работает, и мне так приятно наблюдать, как все это делает то, что я задумал.
2. @holycow — Добро пожаловать, приятель! Добро пожаловать в жизнь разработчика; самые гордые моменты — видеть, как наши творения воплощаются в жизнь. Если мой ответ помог, пожалуйста, отметьте его как принятый, чтобы закрыть цикл по вопросу