فهرست منبع

databases model

simon 10 ماه پیش
والد
کامیت
4e01110932

BIN
databases/Chinook_Sqlite.sqlite


+ 20 - 0
databases/tableview.py

@@ -0,0 +1,20 @@
+import sys
+
+from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView
+
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+        self.table = QTableView()
+
+        # self.model = ?
+        # self.table.setModel(self.model)
+
+        self.setCentralWidget(self.table)
+
+
+app = QApplication(sys.argv)
+window = MainWindow()
+window.show()
+sys.exit(app.exec_())

+ 79 - 0
databases/tableview_querymodel_parameter.py

@@ -0,0 +1,79 @@
+import os
+
+from PyQt5.QtCore import QSize
+from PyQt5.QtSql import QSqlDatabase, QSqlQueryModel, QSqlQuery
+from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView,QWidget, QHBoxLayout, QVBoxLayout, QLineEdit
+
+basedir = os.path.dirname(__file__)
+
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        container = QWidget()
+        layout_search = QHBoxLayout()
+
+        self.track = QLineEdit()
+        self.track.setPlaceholderText("Track name...")
+        self.track.textChanged.connect(self.update_query)
+
+        self.composer = QLineEdit()
+        self.composer.setPlaceholderText("Artist name...")
+        self.composer.textChanged.connect(self.update_query)
+
+        self.album = QLineEdit()
+        self.album.setPlaceholderText("Album name...")
+        self.album.textChanged.connect(self.update_query)
+
+        layout_search.addWidget(self.track)
+        layout_search.addWidget(self.composer)
+        layout_search.addWidget(self.album)
+
+        layout_view = QVBoxLayout()
+        layout_view.addLayout(layout_search)
+        self.table = QTableView()
+        layout_view.addWidget(self.table)
+        container.setLayout(layout_view)
+
+        self.model = QSqlQueryModel()
+        self.table.setModel(self.model)
+
+        self.db = QSqlDatabase("QSQLITE")
+        self.db.setDatabaseName(os.path.join(basedir, "Chinook_Sqlite.sqlite"))
+        self.db.open()
+
+        self.query = QSqlQuery(self.db)
+        self.query.prepare(
+            "select Name, composer, Album.Title from Track "
+            "inner join Album on Track.AlbumId = Album.AlbumId where "
+            "Track.Name like '%' || :track_name || '%' and "
+            "Track.composer like '%' || :composer_name || '%' and "
+            "Album.Title like '%' || :album_title || '%' "
+        )
+
+        self.update_query()
+
+        self.setMinimumSize(QSize(1024, 600))
+        self.setCentralWidget(container)
+
+    def update_query(self, s=None):
+        track_name = self.track.text()
+        track_composer = self.composer.text()
+        album_title = self.album.text()
+
+        self.query.bindValue(":track_name", track_name)
+        self.query.bindValue(":composer_name", track_composer)
+        self.query.bindValue(":album_title", album_title)
+
+        self.query.exec_()
+        self.model.setQuery(self.query)
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    sys.exit(app.exec_())

+ 45 - 0
databases/tableview_relationalmodel.py

@@ -0,0 +1,45 @@
+import os
+
+from PyQt5.QtCore import QSize
+from PyQt5.QtSql import QSqlDatabase, QSqlRelationalTableModel, QSqlRelation, QSqlRelationalDelegate
+from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView
+
+basedir = os.path.dirname(__file__)
+
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        self.table = QTableView()
+
+        self.db = QSqlDatabase("QSQLITE")
+        self.db.setDatabaseName(os.path.join(basedir, "Chinook_Sqlite.sqlite"))
+        self.db.open()
+
+        self.model = QSqlRelationalTableModel(db=self.db)
+        self.model.setTable("Track")
+
+        self.model.setRelation(2, QSqlRelation("Album", "AlbumId", "Title"))
+        self.model.setRelation(3, QSqlRelation("MediaType", "MediaTypeId", "Name"))
+        self.model.setRelation(4, QSqlRelation("Genre", "GenreId", "Name"))
+
+        delegate = QSqlRelationalDelegate(self.table)
+
+        self.table.setItemDelegate(delegate)
+
+        self.model.select()
+
+        self.table.setModel(self.model)
+
+        self.setMinimumSize(QSize(1024, 600))
+        self.setCentralWidget(self.table)
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    sys.exit(app.exec_())

+ 50 - 0
databases/tableview_tablemodel.py

@@ -0,0 +1,50 @@
+import os
+
+from PyQt5.QtCore import QSize, Qt
+from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
+from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView
+
+basedir = os.path.dirname(__file__)
+
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        self.table = QTableView()
+
+        self.db = QSqlDatabase("QSQLITE")
+        self.db.setDatabaseName(os.path.join(basedir, "Chinook_Sqlite.sqlite"))
+        self.db.open()
+
+        self.model = QSqlTableModel(db=self.db)
+        self.model.setTable("Track")
+        # idx = self.model.fieldIndex("Milliseconds")
+        # self.model.setSort(idx, Qt.DescendingOrder)
+        column_titles = {
+            "Name": "Name",
+            "Composer": "Composer",
+            "AlbumId": "Album (ID)",
+            "MediaTypeId": "Media Type (ID)",
+            "GenreId": "Genre (ID)",
+        }
+        for n, t in column_titles.items():
+            idx = self.model.fieldIndex(n)
+            self.model.setHeaderData(idx, Qt.Horizontal, t)
+            # self.model.setHeaderData(1, Qt.Horizontal, "Name")
+        self.model.select()
+        # self.model.setEditStrategy(QSqlTableModel.OnRowChange)
+
+        self.table.setModel(self.model)
+
+        self.setMinimumSize(QSize(1024, 600))
+        self.setCentralWidget(self.table)
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    sys.exit(app.exec_())

+ 57 - 0
databases/tableview_tablemodel_filter.py

@@ -0,0 +1,57 @@
+import os
+import re
+
+from PyQt5.QtCore import QSize
+from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
+from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QWidget, QVBoxLayout, QLineEdit, QMessageBox
+
+basedir = os.path.dirname(__file__)
+
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        container = QWidget()
+        layout = QVBoxLayout()
+
+        self.search = QLineEdit()
+        self.search.textChanged.connect(self.update_filter)
+        self.table = QTableView()
+
+        layout.addWidget(self.search)
+        layout.addWidget(self.table)
+        container.setLayout(layout)
+
+        self.db = QSqlDatabase("QSQLITE")
+        self.db.setDatabaseName(os.path.join(basedir, "Chinook_Sqlite.sqlite"))
+
+        if not self.db.open():
+            QMessageBox.critical(None, "Database Error", self.db.lastError().text())
+            return
+
+        self.model = QSqlTableModel(db=self.db)
+        self.model.setTable("Track")
+        self.model.select()
+
+        if self.model.rowCount() == 0:
+            QMessageBox.warning(self, "Warning", "No data found in the table.")
+
+        self.table.setModel(self.model)
+
+        self.setMinimumSize(QSize(1024, 600))
+        self.setCentralWidget(container)
+
+    def update_filter(self, s):
+        s = re.sub('[\\W_]+', "", s)
+        filter_str = 'LOWER(Name) like "%{}%"'.format(s.lower())
+        self.model.setFilter(filter_str)
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    sys.exit(app.exec_())

+ 112 - 0
databases/widget_mapper.py

@@ -0,0 +1,112 @@
+import os
+import sys
+
+from PyQt5.QtCore import QSize, Qt
+from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
+from PyQt5.QtWidgets import (
+    QApplication,
+    QComboBox,
+    QDataWidgetMapper,
+    QDoubleSpinBox,
+    QFormLayout,
+    QLabel,
+    QLineEdit,
+    QMainWindow,
+    QSpinBox,
+    QWidget,
+    QVBoxLayout,
+    QHBoxLayout,
+    QPushButton,
+)
+
+basedir = os.path.dirname(__file__)
+
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        form = QFormLayout()
+
+        self.track_id = QSpinBox()
+        self.track_id.setRange(0, 2147483647)
+        self.track_id.setDisabled(True)
+        self.name = QLineEdit()
+        self.album = QComboBox()
+        self.genre = QComboBox()
+        self.composer = QLineEdit()
+
+        self.milliseconds = QSpinBox()
+        self.milliseconds.setRange(0, 2147483647)
+        self.milliseconds.setSingleStep(1)
+
+        self.bytes = QSpinBox()
+        self.bytes.setRange(0, 2147483647)
+        self.bytes.setSingleStep(1)
+
+        self.unit_price = QDoubleSpinBox()
+        self.unit_price.setRange(0, 999)
+        self.unit_price.setSingleStep(0.01)
+        self.unit_price.setPrefix("$")
+
+        form.addRow(QLabel("Track ID"), self.track_id)
+        form.addRow(QLabel("Track name"), self.name)
+        form.addRow(QLabel("Composer"), self.composer)
+        form.addRow(QLabel("Milliseconds"), self.milliseconds)
+        form.addRow(QLabel("Bytes"), self.bytes)
+        form.addRow(QLabel("Unit price"), self.unit_price)
+
+        print("driver list: ", ' '.join(QSqlDatabase.drivers()))
+        self.db = QSqlDatabase("QSQLITE")
+        self.db.setDatabaseName(os.path.join(basedir, "Chinook_Sqlite.sqlite"))
+        self.db.open()
+
+        self.model = QSqlTableModel(db=self.db)
+
+        self.mapper = QDataWidgetMapper()
+        self.mapper.setModel(self.model)
+
+        self.mapper.addMapping(self.track_id, 0)
+        self.mapper.addMapping(self.name, 1)
+        self.mapper.addMapping(self.composer, 5)
+        self.mapper.addMapping(self.milliseconds, 6)
+        self.mapper.addMapping(self.bytes, 7)
+        self.mapper.addMapping(self.unit_price, 8)
+
+        self.model.setTable("Track")
+        self.model.select()
+
+        self.mapper.toFirst()
+
+        self.setMinimumSize(QSize(400, 400))
+
+        controls = QHBoxLayout()
+        prev_rec = QPushButton("Previous")
+        prev_rec.clicked.connect(self.mapper.toPrevious)
+        next_rec = QPushButton("Next")
+        next_rec.clicked.connect(self.mapper.toNext)
+        save_rec = QPushButton("Save Changes")
+        save_rec.clicked.connect(self.mapper.submit)
+
+        controls.addWidget(prev_rec)
+        controls.addWidget(next_rec)
+        controls.addWidget(save_rec)
+
+        form.setLabelAlignment(
+            Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTrailing | Qt.AlignmentFlag.AlignVCenter)
+
+        layout = QVBoxLayout()
+        layout.addLayout(form)
+        layout.addLayout(controls)
+
+        widget = QWidget()
+        widget.setLayout(layout)
+
+        self.setCentralWidget(widget)
+
+
+if __name__ == "__main__":
+    app = QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    sys.exit(app.exec_())