Команда обновления SQLite не обновляет базу данных

#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 — Добро пожаловать, приятель! Добро пожаловать в жизнь разработчика; самые гордые моменты — видеть, как наши творения воплощаются в жизнь. Если мой ответ помог, пожалуйста, отметьте его как принятый, чтобы закрыть цикл по вопросу