Russian Qt Forum

Qt => Базы данных => Тема начата: Пытон от Февраль 01, 2012, 19:02



Название: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Февраль 01, 2012, 19:02
Код
Python
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
   def __init__(self):
       QtGui.QWidget.__init__(self)
       self.resize(600, 400)
 
       self.connect()
 
   def connect(self):
       con = QtSql.QSqlDatabase.addDatabase("QSQLITE ", "Base")
       con.setDatabaseName("SQLiteBase/1.s3db")
 
       if not con.open():
           print ("База данных не открылась!")
           print ("-"+con.lastError().text()+"-")
           print (str(con.lastError().type()))
 
       cur = QtSql.QSqlQuery()
       cur.exec("SELECT * FROM One")
       print (cur.lastError().text())
 
 
       con.close()
 
 
 
if __name__ == "__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   form1 = mainform()
   form1.setWindowTitle("Работа с базами данных в PyQt4")
   form1.show()
   sys.exit(app.exec_())

Люди, пишущие на питоне, объясните, почему не происходит соединение с базой данных? И ведь вроде con.open() срабатывает, но далее по тексту программы команда  print(cur.lastError().text()) выдаёт ошибку "driver not loaded"

Почему он не лоадед? Куда он делся? Вроде ж поддержка в Qt баз данных sqlite идёт "из каробки"? Почему же без проблем работает программа-пример из поставки PyQt, из каталога с примерами?
 


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: ecspertiza от Февраль 02, 2012, 08:54
Дело может и не в этом, но путь к БД немного странный "SQLiteBase/1.s3db" . Может конечно дело привычки, но если это относительный путь, и устанавливать нужно относительно текущего каталога, я всега пишу "./SQLiteBase/1.s3db"

Еще ты указываешь для соединения имя "Base" - это значит что тебе нунжно будет в конструктор QSqlQuery передавать ссылку на экземпляр QSqlDatabase, так как QSqlQuery без него будет пробовать использовать соединение со стандартным именем. Так что либо убери "Base" либо попробуй так

Код:
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(600, 400)
 
        self.connect()
 
    def connect(self):
        con = QtSql.QSqlDatabase.addDatabase("QSQLITE ", "Base")
        con.setDatabaseName("./SQLiteBase/1.s3db")
 
        if not con.open():
            print ("База данных не открылась!")
            print ("-"+con.lastError().text()+"-")
            print (str(con.lastError().type()))
 
        cur = QtSql.QSqlQuery(con)
        cur.exec("SELECT * FROM One")
        print (cur.lastError().text())
 
 
        con.close()
 
 
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form1 = mainform()
    form1.setWindowTitle("Работа с базами данных в PyQt4")
    form1.show()
    sys.exit(app.exec_())


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Nimbus от Февраль 02, 2012, 16:53
>"QSQLITE "
А пробел в названии драйвера допустим?


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Февраль 03, 2012, 18:34

 Так что либо убери "Base" либо попробуй так

Код:
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(600, 400)
 
        self.connect()
 
    def connect(self):
        con = QtSql.QSqlDatabase.addDatabase("QSQLITE ", "Base")
        con.setDatabaseName("./SQLiteBase/1.s3db")
 
        if not con.open():
            print ("База данных не открылась!")
            print ("-"+con.lastError().text()+"-")
            print (str(con.lastError().type()))
 
        cur = QtSql.QSqlQuery(con)
        cur.exec("SELECT * FROM One")
        print (cur.lastError().text())
 
 
        con.close()
 
 
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form1 = mainform()
    form1.setWindowTitle("Работа с базами данных в PyQt4")
    form1.show()
    sys.exit(app.exec_())

а чего изменилось-то?

п.с. пишу под windows


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Февраль 03, 2012, 18:38
Пардон, увидел, что изменилось. Щаз попробую.


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Февраль 04, 2012, 12:45
Соединение установилось. Но, блин, что это за мерзопакость, когда в ошибке тебе пишут совсем не то, что есть на самом деле? Причём тут какой-то драйвер, когда просто напросто для QtSqlQuery не было указано с каким объектом соединения работать?

Новый вопрос:
Не получается выбрать данные из таблицы для QtSqlTableModel. С QtSqlQuryModel всё работает без проблем.

Код
Python
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
   def __init__(self):
       QtGui.QWidget.__init__(self)
       self.resize(600, 400)
 
 
       self.view = QtGui.QTableView()
       self.model2 = QtSql.QSqlTableModel()
 
       self.view.setModel(self.model2)
 
       self.layout = QtGui.QVBoxLayout()
       self.layout.addWidget(self.view)
       self.setLayout(self.layout)
 
       self.connect()
       self.get_data_from_table()
 
 
   def connect(self):
       self.con = QtSql.QSqlDatabase.addDatabase("QSQLITE", "Base")
       self.con.setDatabaseName("./SQLiteBase/1.s3db")
 
       if not self.con.open():
           print ("База данных не открылась!")
           print ("-"+self.con.lastError().text()+"-")
           print (str(self.con.lastError().type()))
 
   def get_data_from_table(self):
 
       self.model2.setTable("One")
       self.model2.select()
 
 
 
 
if __name__ == "__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   form1 = mainform()
   form1.setWindowTitle("Работа с базами данных в PyQt4")
   form1.show()
   sys.exit(app.exec_())
 
 

Вот я указываю self.model2.setTable("One"). А каким макаром он узнает из какого соединения брать эту таблицу-то? Как ему указать, что работать нужно с соединением con? Он мне и показывает пустой QtGui.QTableView() в итоге. Что-то в моём учебнике не дописано. Попытался сам найти среди методов QtSqlTableModel метод для указания соединения, не нашёл.

Плиз, хелп!


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Nimbus от Февраль 05, 2012, 08:30
self.model2 = QtSql.QSqlTableModel(self, self.con)
По идее так её надо создавать, но только уже не в конструкторе, ибо там ещё ничего неизвестно об атрибуте con, а в методе connect :)


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Февраль 05, 2012, 10:43
Пасиб, попробую.


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Февраль 07, 2012, 18:08
Мне интересно, вот указал я для QSqlTableModel таблицу, а в ней двадцать тысяч записей. Он что все двадцать тысяч разом заграбастает? Или как этот механизм работает?


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: ecspertiza от Февраль 07, 2012, 20:35
нет не все, вроде по 250, остальные по необходимости подгружает


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Сентябрь 08, 2013, 15:35
Код
Python
import os
from PyQt4 import QtSql
 
kon = QtSql.QSqlDatabase.addDatabase("QSQLITE")
kon.setDatabaseName("./MainDB/reestr.sqlite3")
print ("Существует ли путь?  "+str(os.path.exists("./MainDB/reestr.sqlite3")))
if not kon.open():
   print ("error")
   print(kon.lastError().text())
else:
   print ("open")
 
Результат работы программы:

Существует ли путь?  True
error
Driver not loaded Driver not loaded
-----
Да что, дери его за ногу, опять не так-то?
В этой же директории лежит другая моя питон-программа, с граф. интерфейсом, с моделями, менюшками, из которой я и скопировал эти две строчки на подключение к БД. Но та программа без проблем подключается, а эта ни в какую!

 >:(


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: panAlexey от Сентябрь 09, 2013, 15:09
Может стоит привести "./MainDB/reestr.sqlite3" к абсолютному пути для
kon.setDatabaseName("./MainDB/reestr.sqlite3")
???


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Сентябрь 09, 2013, 17:53
Пытался. Безрезультатно.


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Сентябрь 09, 2013, 18:05
И ведь всё различие между двумя программами: в вышеприведённой соединение создаётся сразу же; в той в другой, упомянутой мною, соединение создаётся в теле метода экземпляра класса основанного на QtGui.QMainWindow. Т.е. там self.kon = QtSql.QSqlDatabase.add... и т.д.


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Пытон от Сентябрь 09, 2013, 18:40
Итить-колотить, что, оказывается, причиной-то всему этому безобразию является!

Без app=QtGui.QApplication(sys.argv) никакого доступа к БД не получишь! Добавляю эту строчку в начало программы - есть подключение к БД, помещаю её в комментарий - нет подключения к БД.


QtSql без QtGui.QApplication не фурычит? А почаму? ???


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Bepec от Сентябрь 09, 2013, 18:42
Кхм. Оно не фурычит без цикла событий. А цикл событий запускается при помощи QApplication/QCoreApplication/EventLoop я так думаю. Хотя и нет полной уверенности.


Название: Re: PyQt4+QtSql+SQLITE. Не соединяется с базой!
Отправлено: Old от Сентябрь 09, 2013, 18:56
QtSql без QtGui.QApplication не фурычит? А почаму? ???
Есть QCoreApplication.