Skip to content

Commit c2de0d9

Browse files
authored
Add Turan's SQLite DB Browser
1 parent 50d3dd7 commit c2de0d9

File tree

6 files changed

+195
-0
lines changed

6 files changed

+195
-0
lines changed
2.36 KB
Binary file not shown.
864 KB
Binary file not shown.
13.9 KB
Binary file not shown.
9.53 KB
Loading

Projects/sqlite_browser/main.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import sys
2+
import sqlite3
3+
from PyQt5 import QtWidgets, QtSql, QtGui, QtCore
4+
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QApplication, QMessageBox, QInputDialog
5+
from ui_main import Ui_MainWindow
6+
7+
class MainWindow(QMainWindow, Ui_MainWindow):
8+
def __init__(self):
9+
super().__init__()
10+
self.setupUi(self)
11+
self.actionOpen.triggered.connect(self.open_database)
12+
self.searchButton.clicked.connect(self.search_data)
13+
self.addButton.clicked.connect(self.add_data)
14+
self.editButton.clicked.connect(self.edit_data)
15+
self.deleteButton.clicked.connect(self.delete_data)
16+
self.tablesListWidget.itemClicked.connect(self.display_table)
17+
self.db = None
18+
19+
self.set_logo("ishakpasa.jpeg")
20+
21+
def set_logo(self, logo_path):
22+
pixmap = QtGui.QPixmap(logo_path)
23+
self.logoLabel.setPixmap(pixmap.scaled(self.logoLabel.size(), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation))
24+
self.logoLabel.setScaledContents(True)
25+
26+
def open_database(self):
27+
options = QFileDialog.Options()
28+
fileName, _ = QFileDialog.getOpenFileName(self, "Open SQLite Database", "", "SQLite Files (*.sqlite);;All Files (*)", options=options)
29+
if fileName:
30+
self.connect_to_database(fileName)
31+
32+
def connect_to_database(self, db_file):
33+
if self.db:
34+
self.db.close()
35+
36+
self.db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
37+
self.db.setDatabaseName(db_file)
38+
39+
if not self.db.open():
40+
QMessageBox.critical(None, "Database Error", self.db.lastError().text())
41+
return
42+
43+
self.update_table_list()
44+
45+
def update_table_list(self):
46+
query = QtSql.QSqlQuery("SELECT name FROM sqlite_master WHERE type='table';", self.db)
47+
self.tablesListWidget.clear()
48+
while query.next():
49+
self.tablesListWidget.addItem(query.value(0))
50+
51+
def display_table(self, item):
52+
table_name = item.text()
53+
model = QtSql.QSqlTableModel(self, self.db)
54+
model.setTable(table_name)
55+
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
56+
model.select()
57+
self.tableView.setModel(model)
58+
59+
def search_data(self):
60+
search_text = self.searchLineEdit.text()
61+
current_table = self.tablesListWidget.currentItem().text() if self.tablesListWidget.currentItem() else None
62+
if current_table:
63+
query = QtSql.QSqlQuery(f"SELECT * FROM {current_table} WHERE name LIKE '%{search_text}%'", self.db)
64+
model = QtSql.QSqlQueryModel()
65+
model.setQuery(query)
66+
self.tableView.setModel(model)
67+
68+
def add_data(self):
69+
current_table = self.tablesListWidget.currentItem().text() if self.tablesListWidget.currentItem() else None
70+
if current_table:
71+
columns_query = QtSql.QSqlQuery(f"PRAGMA table_info({current_table})", self.db)
72+
columns = []
73+
while columns_query.next():
74+
columns.append(columns_query.value(1))
75+
data = []
76+
for col in columns:
77+
value, ok = QInputDialog.getText(self, "Add Data", f"Enter value for {col}:")
78+
if ok:
79+
data.append(value)
80+
else:
81+
return
82+
query = QtSql.QSqlQuery(self.db)
83+
query.prepare(f"INSERT INTO {current_table} ({', '.join(columns)}) VALUES ({', '.join(['?' for _ in columns])})")
84+
for i, val in enumerate(data):
85+
query.bindValue(i, val)
86+
if not query.exec_():
87+
QMessageBox.critical(self, "Insert Error", query.lastError().text())
88+
else:
89+
self.display_table(self.tablesListWidget.currentItem())
90+
91+
def edit_data(self):
92+
index = self.tableView.currentIndex()
93+
if not index.isValid():
94+
QMessageBox.warning(self, "Edit Error", "Please select a cell to edit.")
95+
return
96+
new_value, ok = QInputDialog.getText(self, "Edit Data", "Enter new value:")
97+
if ok:
98+
model = self.tableView.model()
99+
model.setData(index, new_value)
100+
model.submitAll()
101+
102+
def delete_data(self):
103+
index = self.tableView.currentIndex()
104+
if not index.isValid():
105+
QMessageBox.warning(self, "Delete Error", "Please select a row to delete.")
106+
return
107+
model = self.tableView.model()
108+
model.removeRow(index.row())
109+
model.submitAll()
110+
111+
if __name__ == '__main__':
112+
app = QApplication(sys.argv)
113+
window = MainWindow()
114+
window.show()
115+
sys.exit(app.exec_())

Projects/sqlite_browser/ui_main.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from PyQt5 import QtWidgets, QtCore, QtGui
2+
3+
class Ui_MainWindow(object):
4+
def setupUi(self, MainWindow):
5+
MainWindow.setObjectName("MainWindow")
6+
MainWindow.resize(800, 600)
7+
8+
self.centralwidget = QtWidgets.QWidget(MainWindow)
9+
self.centralwidget.setObjectName("centralwidget")
10+
11+
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
12+
self.verticalLayout.setObjectName("verticalLayout")
13+
14+
self.logoLabel = QtWidgets.QLabel(self.centralwidget)
15+
self.logoLabel.setAlignment(QtCore.Qt.AlignCenter)
16+
self.logoLabel.setFixedSize(250, 200)
17+
self.verticalLayout.addWidget(self.logoLabel, alignment=QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
18+
19+
self.tablesListWidget = QtWidgets.QListWidget(self.centralwidget)
20+
self.tablesListWidget.setObjectName("tablesListWidget")
21+
self.verticalLayout.addWidget(self.tablesListWidget)
22+
23+
self.searchLayout = QtWidgets.QHBoxLayout()
24+
self.searchLineEdit = QtWidgets.QLineEdit(self.centralwidget)
25+
self.searchLineEdit.setObjectName("searchLineEdit")
26+
self.searchButton = QtWidgets.QPushButton(self.centralwidget)
27+
self.searchButton.setObjectName("searchButton")
28+
self.searchButton.setText("Search")
29+
self.searchLayout.addWidget(self.searchLineEdit)
30+
self.searchLayout.addWidget(self.searchButton)
31+
self.verticalLayout.addLayout(self.searchLayout)
32+
33+
self.buttonLayout = QtWidgets.QHBoxLayout()
34+
self.addButton = QtWidgets.QPushButton(self.centralwidget)
35+
self.addButton.setObjectName("addButton")
36+
self.addButton.setText("Add")
37+
self.editButton = QtWidgets.QPushButton(self.centralwidget)
38+
self.editButton.setObjectName("editButton")
39+
self.editButton.setText("Edit")
40+
self.deleteButton = QtWidgets.QPushButton(self.centralwidget)
41+
self.deleteButton.setObjectName("deleteButton")
42+
self.deleteButton.setText("Delete")
43+
self.buttonLayout.addWidget(self.addButton)
44+
self.buttonLayout.addWidget(self.editButton)
45+
self.buttonLayout.addWidget(self.deleteButton)
46+
self.verticalLayout.addLayout(self.buttonLayout)
47+
48+
self.tableView = QtWidgets.QTableView(self.centralwidget)
49+
self.tableView.setObjectName("tableView")
50+
self.verticalLayout.addWidget(self.tableView)
51+
52+
MainWindow.setCentralWidget(self.centralwidget)
53+
54+
self.menubar = QtWidgets.QMenuBar(MainWindow)
55+
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
56+
self.menubar.setObjectName("menubar")
57+
58+
self.menuFile = QtWidgets.QMenu(self.menubar)
59+
self.menuFile.setObjectName("menuFile")
60+
61+
MainWindow.setMenuBar(self.menubar)
62+
63+
self.statusbar = QtWidgets.QStatusBar(MainWindow)
64+
self.statusbar.setObjectName("statusbar")
65+
MainWindow.setStatusBar(self.statusbar)
66+
67+
self.actionOpen = QtWidgets.QAction(MainWindow)
68+
self.actionOpen.setObjectName("actionOpen")
69+
70+
self.menuFile.addAction(self.actionOpen)
71+
self.menubar.addAction(self.menuFile.menuAction())
72+
73+
self.retranslateUi(MainWindow)
74+
QtCore.QMetaObject.connectSlotsByName(MainWindow)
75+
76+
def retranslateUi(self, MainWindow):
77+
_translate = QtCore.QCoreApplication.translate
78+
MainWindow.setWindowTitle(_translate("MainWindow", "Turan's SQLite Browser"))
79+
self.menuFile.setTitle(_translate("MainWindow", "File"))
80+
self.actionOpen.setText(_translate("MainWindow", "Open"))

0 commit comments

Comments
 (0)