Python SQLite оператор вставки выполняет, но не вставляет никаких данных - PullRequest
0 голосов
/ 02 января 2019

Уважаемое сообщество 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)

Когда я выполняю свой код, я не получаю сообщение об ошибке но записи просто не будут отображаться в базе данных. enter image description here

Когда я копирую оператор SQL из своего кода и напрямую выполняю его в sqlite cli, он отлично работает.

enter image description here

Надеюсь, кто-то из вас знает, чего мне не хватает. Большое спасибо:)

1 Ответ

0 голосов
/ 02 января 2019

Хорошо, я нашел решение благодаря @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

Привет

...