QSqlQuery :: exec: база данных не открыта, PyQt - PullRequest
2 голосов
/ 02 марта 2012

Я пытаюсь вывести данные из базы данных sqlite. Я сделал это, как в примерах 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.

1 Ответ

6 голосов
/ 02 марта 2012

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

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

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

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

QSqlDatabase.addDatabase

QSqlQuery

...