Найти - Пользователи
Полная версия: Объясните, почему не создаётся вторая таблица?
Начало » Базы данных » Объясните, почему не создаётся вторая таблица?
1
Pluto
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) и всё.
PooH
Ну так-то во втором запросе не хватает закрывающей скобки. А вот почему не бросается исключение не подскажу, через Qt с базами не работал.

PS: и сразу не заметил - id_n INTEGER AUTOINCREMENT - AUTOINCREMENT без PRIMARY KEY ошибка
reclosedev
PooH
А вот почему не бросается исключение не подскажу, через Qt с базами не работал.
В Qt exec_ возвращает True при удачном выполнении, иначе False.
Ошибку можно посмотреть через query.lastError().text()
Pluto
Благодарю! С учётом указанных исправлений всё сработало.

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

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

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

Вам же уже reclosedev подсказал - смотрите возвращаемое exec_ значение
Pluto
Ну, а я что смотрю? Может я смотрю как-то не так как надо? Или через exсept его не поймать? Надо, видимо, через myvar = query.exec_(“траляля”) if myvar = False: print (query.lastError().text())? Сейчас попробую.
Pluto
Блин, точно! Try-except ему по-барабану!
Проверять только переменной, которой присваиваем результат возвращаемый query.exec_().
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB