2012-03-02 2 views
2

Я пытаюсь вывести данные из базы данных sqlite. Я сделал это как в примерах PyQt, но это не сработает. Кажется, что база данных открыта, но код дает ошибки, а это не так. Не могли бы вы рассказать мне, почему и как я могу это исправить?QSqlQuery :: exec: database not open, PyQt

##################################################################### 
# test.py               # 
# ! /usr/bin/env python            # 
# -*- coding: utf-8 -*-           # 
##################################################################### 

from PyQt4 import QtGui, QtCore, QtSql 
from src.database import DBase 

class Test(QtGui.QMainWindow): 

    def __init__(self): 
     super(Test, self).__init__() 

     self.tview = QtGui.QTableView() 
     self.setCentralWidget(self.tview) 
     model = QtSql.QSqlTableModel(self) 
     model.setTable("person") 
     model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) 
     model.select() 
     model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QObject.trUtf8(model, "№")) 
     model.setHeaderData(1, QtCore.Qt.Horizontal, QtCore.QObject.trUtf8(model, "Name")) 
     model.setHeaderData(2, QtCore.Qt.Horizontal, QtCore.QObject.trUtf8(model, "Lastname")) 

     self.tview.setModel(model) 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    db = DBase() 
    db.connection_db() 
    window = Test() 
    window.resize(800, 600) 
    window.show() 
    sys.exit(app.exec_()) 

##################################################################### 
# database.py              # 
# ! /usr/bin/env python            # 
# -*- coding: utf-8 -*-           # 

from PyQt4 import QtSql, QtGui 

class DBase(): 
    def connection_db(self): 
     db=QtSql.QSqlDatabase.addDatabase("QSQLITE", "Base") 
     db.setDatabaseName("db.sqlite") 
     if db.open(): 
      print 'DataBase is now opened.' 
      query = QtSql.QSqlQuery() 
      query.exec_("create table person(id int primary key, " 
        "firstname varchar(20), lastname varchar(20))") 
      query.exec_("insert into person values(101, 'Danny', 'Young')") 
      query.exec_("insert into person values(102, 'Christine', 'Holand')") 
      query.exec_("insert into person values(103, 'Lars', 'Gordon')") 
      query.exec_("insert into person values(104, 'Roberto', 'Robitaille')") 
     return True 

В выходе он дает это:

C:\Python27\python.exe D:test.py 
QSqlQuery::exec: database not open 
QSqlQuery::exec: database not open 
QSqlQuery::exec: database not open 
QSqlQuery::exec: database not open 
QSqlQuery::exec: database not open 
DataBase is now opened. 

ответ

6

В вашей connection_db функции при вызове QtSql.QSqlDatabase.addDatabase("QSQLITE", "Base") последний параметр ("Base") это имя соединения.

Когда вы создаете свой QSqlQuery, вы не указываете экземпляр базы данных для использования, поэтому использует соединение по умолчанию приложения. Поскольку вы дали своему соединению имя соединения, ваше приложение не имеет подключения по умолчанию, поэтому QSqlQuery не видит открытую базу данных.

Попробуйте изменить query = QtSql.QSqlQuery() на номер query = QtSql.QSqlQuery(db) в вашей функции connection_db. Это позволяет QSqlQuery знать, какое соединение он должен использовать.

Документация:

QSqlDatabase.addDatabase

QSqlQuery

+0

Могу ли я задать еще один вопрос? Почему «self.tview» все еще пуст? – SaulTigh

+2

Это то же самое - вам нужно передать экземпляр базы данных в QSqlTableModel при его создании. Взгляните на документацию для QSqlTableModel .__ init __(). Если вы используете только одно подключение к базе данных, вам может быть лучше не указывать имя соединения при добавлении базы данных. Таким образом, запросам и табличным моделям не нужно будет говорить, какое соединение использовать, они просто будут использовать стандартное (безымянное) соединение. Вам действительно нужно использовать имена соединений, если вы открываете несколько подключений или используете несколько баз данных. –