亲爱的Stackoverflow社区,
我有以下问题。我正在使用Python 3.5和SQLite3包,试图将20个城市插入到我的数据库的城市表中。问题是,在执行代码后没有错误消息,但是这些条目不会出现在数据库中。
我的代码如下:
Database.py:该文件封装了数据库并提供了轻松执行查询的功能。
当我执行我的代码时,没有任何错误提示,但是数据库中的条目却不会显示出来。 当我从我的代码中复制SQL语句并直接在sqlite cli上执行它时,它完美地工作。
我有以下问题。我正在使用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上执行它时,它完美地工作。
我希望有人知道我缺少了什么。非常感谢:)
commit
语句在哪里?请阅读 sqlite3.Connection.commit。 - stovfl