Python SQLite插入语句执行但不插入任何数据。

3
亲爱的Stackoverflow社区,
我有以下问题。我正在使用Python 3.5和SQLite3包,试图将20个城市插入到我的数据库的城市表中。问题是,在执行代码后没有错误消息,但是这些条目不会出现在数据库中。
我的代码如下:
Database.py:该文件封装了数据库并提供了轻松执行查询的功能。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
from sqlite3 import Error

class Database:
    database_connection = 0;

    def __init__(self, path_to_database):
        self.__try_connect__(path_to_database)

    def __try_connect__ (self, path_to_database):

        """ create a database connection to the SQLite database
        specified by the db_file
        :param db_file: database file
        :return: Connection object or None
        """
        try:
            self.database_connection = sqlite3.connect(path_to_database)
        except Error as e:
            print(e)

    def execute_query(self, query):

        database_cursor = self.database_connection.cursor()
        print(database_cursor.execute(query))

    def insert(self, table_name, assoziative_key_value_array):
        print("insert not yet implemented")

DatabaseCreator.py:如果您想尝试运行我的代码,您可以使用这个类为您创建数据库。

from Database import Database

class DatabaseCreator:
    database = 0
    @staticmethod
    def create(path_to_database):
        database = Database(path_to_database)
        DatabaseCreator.delete_old(database)
        DatabaseCreator.create_new(database)

    @staticmethod
    def delete_old(database):
        print("@DatabaseCreator - delete old")
        database.execute_query("DROP TABLE 'Städte'")
        database.execute_query("DROP TABLE 'Vereine'")
        database.execute_query("DROP TABLE 'Präsidenten'")
        database.execute_query("DROP TABLE 'Spieler'")

    @staticmethod
    def create_new(database):
        print("@DatabaseCreator - create new");
        database.execute_query("CREATE TABLE 'Städte' ('Id' INTEGER PRIMARY KEY, 'Name' Varchar NOT NULL);")
        database.execute_query("CREATE TABLE 'Präsidenten' ('Id' INTEGER PRIMARY KEY, 'Name' Varchar NOT NULL);")
        database.execute_query("CREATE TABLE 'Vereine' ('Id' INTEGER PRIMARY KEY, 'Name' Varchar NOT NULL, 'Tabellenplatz' INTEGER NOT NULL, 'PräsidentId' INTEGER NOT NULL, 'StadtId' INTEGER NOT NULL, FOREIGN KEY('StadtId') REFERENCES 'Städte'('Id'), FOREIGN KEY('PräsidentId') REFERENCES 'Präsidenten'('Id') ,CONSTRAINT exclusive_präsidentschaft UNIQUE ('PräsidentId'));")
        database.execute_query("CREATE TABLE 'Spieler' ('Id' INTEGER PRIMARY KEY, 'Name' Varchar NOT NULL, 'Alter' INTEGER NOT NULL, 'Position' Varchar NOT NULL, 'VereinId' INTEGER NOT NULL, FOREIGN KEY('VereinId') REFERENCES 'Vereine'('Id'));")

DatabaseSeeder.py:这个类在其静态方法中使用了 Database 类,并尝试将 20 个城市插入数据库。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Database import Database


class DatabaseSeeder:

    database = 0

    @staticmethod
    def seed(database):
        DatabaseSeeder.seed_cities(database)
        DatabaseSeeder.seed_presidents(database)
        DatabaseSeeder.seed_clubs(database)
        DatabaseSeeder.seed_players(database)

    @staticmethod
    def seed_cities(database):
        print("@DatabaseSeeder - seed cities")
        cities = [
            "Berlin",
            "Hamburg",
            "München",
            "Köln",
            "Frankfurt am Main",
            "Stuttgart",
            "Düsseldorf",
            "Dortmund",
            "Essen",
            "Leipzig",
            "Bremen",
            "Dresden",
            "Hannover",
            "Nürnberg",
            "Duisburg",
            "Bochum",
            "Wuppertal",
            "Bielefeld",
            "Bonn",
            "Münster"
        ]

        insert_city_sql_template = "INSERT INTO 'Städte' ('{0}') VALUES ('{1}');"
        for city in cities:
            sql_query = insert_city_sql_template.format("Name", city)
            print(sql_query)
            database.execute_query(sql_query)

我创建最终SQL语句的模板如下:

insert_city_sql_template = "INSERT INTO 'Städte' ('{0}') VALUES ('{1}');"

这里将其格式化为最终的SQL语句:

sql_query = insert_city_sql_template.format("Name", city)

在执行之前,打印出的SQL语句如下:

INSERT INTO 'Städte' ('Name') VALUES ('Berlin');


Application.py:在我的主类中,我首先创建一个新的数据库连接,并将该连接交给DatabaseSeeder类处理。

from tkinter import *
import sqlite3
from sqlite3 import Error
from Database import Database
from table import Table
from DatabaseCreator import DatabaseCreator
from DatabaseSeeder import DatabaseSeeder

def main():
    database_path = "./database.db"
    DatabaseCreator.create(database_path)
    database = Database(database_path)
    DatabaseSeeder.seed(database)

当我执行我的代码时,没有任何错误提示,但是数据库中的条目却不会显示出来。 输入图像描述 当我从我的代码中复制SQL语句并直接在sqlite cli上执行它时,它完美地工作。

enter image description here

我希望有人知道我缺少了什么。非常感谢:)


1
能否在这里格式化实际的代码?请勿包含图片。 - Paritosh Singh
谢谢,用代码替换图片确实是个好主意。 - Jan Kreischer
你的 commit 语句在哪里?请阅读 sqlite3.Connection.commit - stovfl
请尝试创建一个 [mcve]。例如,如果问题是插入数据,我们不需要看到删除函数。 - Bryan Oakley
1个回答

4

好的,我找到了一个解决方案,感谢@stovfl。我真的错过了提交语句。现在我的execute_query方法看起来像这样,末尾有一个commit

def execute_query(self, query):
    try:
        database_cursor = self.database_connection.cursor()
        database_cursor.execute(query)
    except sqlite3.IntegrityError as e:
        print('sqlite error: ', e.args[0])  # column name is not unique
    self.database_connection.commit()

非常感谢您的帮助,并始终记得提交您的更改:D
问候

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接