Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 25, 2012 08:22:07

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtSql import *
class mywindow(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.mainbox = QHBoxLayout()
        self.rightbox = QVBoxLayout()
        self.leftbox = QVBoxLayout()
        self.mainbox.addLayout(self.leftbox)
        self.mainbox.addLayout(self.rightbox)
        self.setLayout(self.mainbox)
        self.btn_create_base = QPushButton("Создать базу")
        self.btn_create_base.clicked.connect(self.create_base)
        self.leftbox.addWidget(self.btn_create_base)
    def create_base(self):
        self.db.setDatabaseName("1.db")
        if self.db.open():
            query = QSqlQuery()
            query.exec_("CREATE TABLE people ("
                        "id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
                        "name VARCHAR(40) NOT NULL)")
            query.exec_("CREATE TABLE property ("
                        "id INTEGER NOT NULL, "
                        "id_n INTEGER AUTOINCREMENT UNIQUE NOT NULL, "
                        "dvig VARCHAR(40), "
                        "nedvig VARCHAR(40), "
                        "FOREIGN KEY (id) REFERENCES people(id)")
            QMessageBox.information(None, "Сообщение", "База данных успешно создана.")
        else:
            QMessageBox.warning(None, "Ошибка", "Создать базу не удалось!\n"+self.db.lastError().text())
        
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window1 = mywindow()
    window1.show()
    sys.exit(app.exec_())

Никаких ошибок не пишет. Просто молча не создаёт вторую таблицу (property) и всё.

Офлайн

#2 Июнь 25, 2012 08:56:25

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

Ну так-то во втором запросе не хватает закрывающей скобки. А вот почему не бросается исключение не подскажу, через Qt с базами не работал.

PS: и сразу не заметил - id_n INTEGER AUTOINCREMENT - AUTOINCREMENT без PRIMARY KEY ошибка



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Июнь 25, 2012 09:09:06)

Офлайн

#3 Июнь 25, 2012 09:49:12

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

PooH
А вот почему не бросается исключение не подскажу, через Qt с базами не работал.
В Qt exec_ возвращает True при удачном выполнении, иначе False.
Ошибку можно посмотреть через query.lastError().text()

Офлайн

#4 Июнь 25, 2012 10:13:54

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

Благодарю! С учётом указанных исправлений всё сработало.

А почему не выдавалось сообщений об ошибке и сам, балда, мог бы догадаться. Я ж проверку на ошибку сделал только для открытия базы. На query.exec_ ни какой проверки не поставил.

Офлайн

#5 Июнь 25, 2012 10:49:07

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

query = QSqlQuery()
        for name in ("Дядя", "Петя Петрович", "Ариадна", "Персей", "Никита Кожемяка"):
             try:
                 query.exec_("INSERT INTO people (name) VALUES ('%s')" %name)
            except query.lastError().text() as err:
                 print (err)

В этой конструкции я сначала допустил ошибку не выведя %name за кавычки, но опять же не получил никакой ошибки! Просто данные в базу не попали и всё. И опять молчком.

Офлайн

#6 Июнь 25, 2012 11:19:33

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

Pluto
В этой конструкции я сначала допустил ошибку не выведя %name за кавычки, но опять же не получил никакой ошибки! Просто данные в базу не попали и всё. И опять молчком.

Вам же уже reclosedev подсказал - смотрите возвращаемое exec_ значение



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Июнь 25, 2012 11:23:58

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

Ну, а я что смотрю? Может я смотрю как-то не так как надо? Или через exсept его не поймать? Надо, видимо, через myvar = query.exec_(“траляля”) if myvar = False: print (query.lastError().text())? Сейчас попробую.

Офлайн

#8 Июнь 25, 2012 11:26:39

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Объясните, почему не создаётся вторая таблица?

Блин, точно! Try-except ему по-барабану!
Проверять только переменной, которой присваиваем результат возвращаемый query.exec_().

Отредактировано Pluto (Июнь 25, 2012 11:27:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version