【问题标题】:SQLite UPDATE command not updating databaseSQLite UPDATE 命令不更新数据库
【发布时间】:2020-11-20 09:21:47
【问题描述】:

我对 SQLite、python 和编程非常陌生,我正在尝试创建一个家庭媒体服务器数据库。我正在尝试编写一个程序,它将新条目添加到我创建的数据库中,并允许我编辑现有条目。虽然我可以很好地添加条目,但更新特定条目是另一回事。例如,我希望能够将特定电影标题更新为新标题,而无需事先知道它有什么 id。我的程序中导致问题的代码部分是这样的:

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 for SQLite 检查我的数据库以确认标题已更新时,我发现没有任何更改。

我在这里做错了什么?我所追求的可能吗?

【问题讨论】:

    标签: python sqlite sql-update


    【解决方案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() 意味着您不必担心 CAPS
    • 您在更新命令之前调用了 break ,所以脚本永远不会到达那里
    • 即使在修复该问题后,您仍试图在关闭的光标上执行命令,这会给出 ProgrammingError;我再次为您打开它,然后运行更新命令,然后关闭并提交

    【讨论】:

    • 非常感谢您的帮助!我现在已经让它工作了,看着它都按照我的意愿工作真是太好了。
    • @holycow - 不客气,伙计!欢迎来到开发者的生活;最自豪的时刻是看到我们的作品栩栩如生。如果我的回答有帮助,请将其标记为已接受以结束问题的循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多