Уважаемое сообщество 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, он отлично работает.
Надеюсь, кто-то из вас знает, чего мне не хватает. Большое спасибо:)