Проблема в реализации Pattern-View-Controller Pattern - PullRequest
0 голосов
/ 04 июня 2018

Я запускаю пример для изучения Pattern-View-Controller Pattern на python, но код выдает ошибку.Я пытался отладить код, но не смог найти основную причину / причину.Удаление close системы соединения работает, но в чем проблема кода?Можете ли вы посоветовать мне, что не так?

# Filename: mvc.py 
import sqlite3 
import types 


class DefectModel: 
    def getDefectList(self, component): 
        query = '''select ID from defects where Component = '%s' ''' %component 
        defectlist = self._dbselect(query) 
        list = [] 
        for row in defectlist: 
            list.append(row[0])
            return list 

    def getSummary(self, id): 
        query = '''select summary from defects where ID = '%d' ''' % id 
        summary = self._dbselect(query) 
        for row in summary: 
            return row[0] 

    def _dbselect(self, query): 
        connection = sqlite3.connect('example.db') 
        cursorObj = connection.cursor() 
        results = cursorObj.execute(query) 
        connection.commit()
        cursorObj.close() 
        return results 

class DefectView: 
    def summary(self, summary, defectid): 
        print("#### Defect Summary for defect# %d ####\n %s"  % (defectid,summary) )

    def defectList(self, list, category): 
        print("#### Defect List for %s ####\n" % category )
        for defect in list: 
            print(defect )

class Controller: 
    def __init__(self): pass 

    def getDefectSummary(self, defectid): 
        model = DefectModel() 
        view = DefectView() 
        summary_data = model.getSummary(defectid) 
        return view.summary(summary_data, defectid) 

    def getDefectList(self, component): 
        model = DefectModel() 
        view = DefectView() 
        defectlist_data = model.getDefectList(component) 
        return view.defectList(defectlist_data, component)

Это связано с run.py.

#run.py
import mvc 
controller = mvc.Controller()
 # Displaying Summary for defect id # 2
print(controller.getDefectSummary(2)) 
# Displaying defect list for 'ABC' Component print 
controller.getDefectList('ABC')

Если вам нужно создать базу данных, она доступна здесь:

# Filename: datbase.py 
import sqlite3 
import types 
# Create a database in RAM
db = sqlite3.connect('example.db')

# Get a cursor object
cursor = db.cursor()
    cursor.execute("drop table defects")

    cursor.execute("CREATE TABLE defects(id INTEGER PRIMARY KEY, Component TEXT, Summary TEXT)")

   cursor.execute("INSERT INTO defects VALUES (1,'XYZ','File doesn‘t get deleted')")
    cursor.execute("INSERT INTO defects VALUES (2,'XYZ','Registry doesn‘t get created')")
    cursor.execute("INSERT INTO defects VALUES (3,'ABC','Wrong title gets displayed')")

    # Save (commit) the changes
    db.commit()

# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
db.close()

Моя ошибка, как показано ниже:

> Windows PowerShell Copyright (C) Microsoft Corporation. All rights
> reserved.
> 
> PS E:\Projects\test> & python e:/Projects/test/mvc.py
> Traceback (most recent call last):   File
> "e:/Projects/test/mvc.py", line 56, in <module>
>     import mvc   File "e:\Projects\test\mvc.py", line 65, in <module>
>     cursor.execute("drop table defects") sqlite3.OperationalError: no such table: defects PS E:\Projects\test> & python
> e:/Projects/ramin/mvc.py Traceback (most recent call last):  
> File "e:/Projects/test/mvc.py", line 56, in <module>
>     import mvc   File "e:\Projects\test\mvc.py", line 80, in <module>
>     print(controller.getDefectSummary(2))   File "e:\Projects\test\mvc.py", line 44, in getDefectSummary
>     summary_data = model.getSummary(defectid)   File "e:\Projects\test\mvc.py", line 18, in getSummary
>     for row in summary: sqlite3.ProgrammingError: Cannot operate on a closed cursor. PS E:\Projects\test>

1 Ответ

0 голосов
/ 04 июня 2018

Я подозреваю, что проблема в этой строке: cursor.execute("drop table defects")

Возможно, вы удалили эту таблицу в предыдущем запуске, и, поскольку ее больше нет, sqlite3 вызывает исключение OperationalError.

В вашем коде есть комментарий, в котором говорится, что вы используете базу данных sqlite в памяти, но это не так.Вот как вы создаете базу данных в памяти:

db = sqlite3.connect(:memory:)

Если вы используете базу данных в памяти, вам не нужно ничего отбрасывать, так как вы создаете базу данных намухи, когда вы запускаете свой скрипт.

Примечание : в прошлом году я хотел лучше понять MVC, поэтому я написал серию статей об этом. Здесь - это тот, где я использую SQLite в качестве бэкэнда хранилища для моей Модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...