[Python] How to update mongodb data in pyqt5 [closed]

Discussão em 'Python' iniciado por Stack, Julho 3, 2025.

  1. Stack

    Stack Membro Participativo

    Title:
    How can I improve this PyQt5 + MongoDB app that adds, searches, updates, and removes records?

    Body:

    I'm building a simple PyQt5 app that connects to MongoDB. It:

    • Adds 10 random student records
    • Searches through them
    • Updates a matching score
    • Deletes matching entries

    It works, but I wonder if looping over all documents (collection.find()) is a good idea for search/update/delete? Should I be using filters instead?

    Here is the full code:

    import sys
    import random
    from pymongo import MongoClient
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *

    client = MongoClient("mongodb://localhost:27017")
    db = client["forquiz"]
    collection = db["students"]

    Subject = ['Math', 'Physics', 'Biology', 'Programming']
    points = [str(i) for i in range(101)]
    ch = random.choice

    class App(QWidget):
    def __init__(self):
    super().__init__()
    self.setWindowTitle("forquiz")
    self.init_ui()

    def init_ui(self):
    layout = QVBoxLayout()
    self.add_btn = QPushButton("Add all records")
    self.search_btn = QPushButton("Search")
    self.update_btn = QPushButton("Update")
    self.remove_btn = QPushButton("Remove ")
    self.search_input = QLineEdit()
    self.search_input.setPlaceholderText("type to search")


    self.output = QTextEdit()
    self.output.setReadOnly(True)

    layout.addWidget(self.add_btn)
    layout.addWidget(QLabel("search somehting:"))
    layout.addWidget(self.search_input)
    layout.addWidget(self.search_btn)
    layout.addWidget(self.update_btn)
    layout.addWidget(self.remove_btn)
    layout.addWidget(QLabel("output:"))
    layout.addWidget(self.output)

    self.setLayout(layout)

    self.add_btn.clicked.connect(self.add_records)
    self.search_btn.clicked.connect(self.search_records)
    self.update_btn.clicked.connect(self.update_records)
    self.remove_btn.clicked.connect(self.remove_records)


    def add_records(self):
    self.output.clear()
    for _ in range(10):
    record = {
    "last_name": ch(LNames),
    "first_name": ch(FNames),
    "subject": ch(Subject),
    "score": ch(points)
    }
    result = collection.insert_one(record)
    self.output.append(f"added: {record} id: {result.inserted_id}")



    def search_records(self):
    word = self.search_input.text()
    self.output.clear()

    if word == "":
    self.output.setText("enter search.")
    return

    results = collection.find()
    found = False
    for answer in results:
    if word in answer.get("first_name", "") or word in answer.get("last_name", "") or word in answer.get("subject", "") or word in answer.get("score", ""):
    self.output.append(str(answer))
    found=True

    if not found:
    self.output.setText("name not found")



    def update_records(self):
    word = self.search_input.text().strip()
    self.output.clear()

    if word == "":
    self.output.setText("Enter a value to update.")
    return

    results = collection.find()
    updated = False
    for result in results:
    if word in result.get("first_name", "") or word in result.get("last_name", "") or word in result.get("subject", "") or word in result.get("score", ""):
    new_score = ch(points)
    collection.update_one({"_id": result["_id"]}, {"$set": {"score": new_score}})
    self.output.append(f"Updated score for {result['first_name']} {result['last_name']} to {new_score}")
    updated = True

    if not updated:
    self.output.setText("No matching records found to update.")


    def remove_records(self):
    word = self.search_input.text().strip()
    self.output.clear()

    if word == "":
    self.output.setText("Enter a value to delete.")
    return

    results = collection.find()
    deleted = False
    for result in results:
    if word in result.get("first_name", "") or word in result.get("last_name", "") or word in result.get("subject", "") or word in result.get("score", ""):
    collection.delete_one({"_id": result["_id"]})
    self.output.append(f"Deleted: {result['first_name']} {result['last_name']} - {result['subject']}, {result['score']}")
    deleted = True

    if not deleted:
    self.output.setText("No matching records found")

    import sys
    import random
    import sqlite3
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *

    # Connect to SQLite and create table if it doesn't exist
    conn = sqlite3.connect("students.db")
    cursor = conn.cursor()
    cursor.execute("""
    CREATE TABLE IF NOT EXISTS students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    first_name TEXT,
    last_name TEXT,
    subject TEXT,
    score TEXT
    )
    """)
    conn.commit()

    LNames = [...]
    FNames = [...]
    Subject = [...]
    points = [str(i) for i in range(101)]
    ch = random.choice

    class App(QWidget):
    def __init__(self):
    super().__init__()
    self.setWindowTitle("forquiz")
    self.init_ui()

    def init_ui(self):
    layout = QVBoxLayout()
    self.add_btn = QPushButton("Add all records")
    self.search_btn = QPushButton("Search")
    self.update_btn = QPushButton("Update")
    self.remove_btn = QPushButton("Remove")
    self.search_input = QLineEdit()
    self.search_input.setPlaceholderText("type to search")

    self.output = QTextEdit()
    self.output.setReadOnly(True)

    layout.addWidget(self.add_btn)
    layout.addWidget(QLabel("search something:"))
    layout.addWidget(self.search_input)
    layout.addWidget(self.search_btn)
    layout.addWidget(self.update_btn)
    layout.addWidget(self.remove_btn)
    layout.addWidget(QLabel("output:"))
    layout.addWidget(self.output)

    self.setLayout(layout)

    self.add_btn.clicked.connect(self.add_records)
    self.search_btn.clicked.connect(self.search_records)
    self.update_btn.clicked.connect(self.update_records)
    self.remove_btn.clicked.connect(self.remove_records)

    def add_records(self):
    self.output.clear()
    for _ in range(10):
    record = (
    ch(FNames),
    ch(LNames),
    ch(Subject),
    ch(points)
    )
    cursor.execute("INSERT INTO students (first_name, last_name, subject, score) VALUES (?, ?, ?, ?)", record)
    conn.commit()
    self.output.append(f"Added: {record}")

    def search_records(self):
    word = self.search_input.text().strip()
    self.output.clear()
    if word == "":
    self.output.setText("Enter search.")
    return

    cursor.execute("SELECT * FROM students")
    results = cursor.fetchall()
    found = False
    for row in results:
    if any(word.lower() in str(field).lower() for field in row[1:]):
    self.output.append(str(row))
    found = True

    if not found:
    self.output.setText("Name not found")

    def update_records(self):
    word = self.search_input.text().strip()
    self.output.clear()
    if word == "":
    self.output.setText("Enter a value to update.")
    return

    cursor.execute("SELECT * FROM students")
    results = cursor.fetchall()
    updated = False
    for row in results:
    if any(word.lower() in str(field).lower() for field in row[1:]):
    new_score = ch(points)
    cursor.execute("UPDATE students SET score = ? WHERE id = ?", (new_score, row[0]))
    conn.commit()
    self.output.append(f"Updated score for {row[1]} {row[2]} to {new_score}")
    updated = True

    if not updated:
    self.output.setText("No matching records found to update.")

    def remove_records(self):
    word = self.search_input.text().strip()
    self.output.clear()
    if word == "":
    self.output.setText("Enter a value to delete.")
    return

    cursor.execute("SELECT * FROM students")
    results = cursor.fetchall()
    deleted = False
    for row in results:
    if any(word.lower() in str(field).lower() for field in row[1:]):
    cursor.execute("DELETE FROM students WHERE id = ?", (row[0],))
    conn.commit()
    self.output.append(f"Deleted: {row[1]} {row[2]} - {row[3]}, {row[4]}")
    deleted = True

    if not deleted:
    self.output.setText("No matching records found")

    if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())


    if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())

    Continue reading...

Compartilhe esta Página