代码之家  ›  专栏  ›  技术社区  ›  Владислав

这是管理数据库的正确方法吗?

  •  -1
  • Владислав  · 技术社区  · 1 年前

    我正在使用MysqlDB在python上编写一个小应用程序。 你能告诉我这种方法可行吗? 我只是不确定是否每次都应该向DB询问一些数据,因为我知道自上次调用以来没有任何变化。从技术上讲,这种方式可以减少多余的工作量,尽管感觉很不对

    def update(sub=False, adm=False, bkl=False, dct=False, usr=False) -> None:
        global subscribers, admins, blacklist, dictionary, users
        if sub:
            cursor.execute("SELECT id FROM users WHERE is_subscribed = TRUE")
            subscribers = [i[0] for i in cursor.fetchall()]
        if adm:
            cursor.execute("SELECT id FROM users WHERE is_admin = TRUE")
            admins = [i[0] for i in cursor.fetchall()]
        if bkl:
            cursor.execute("SELECT id FROM users WHERE is_banned = TRUE")
            blacklist = [i[0] for i in cursor.fetchall()]
        if usr:
            cursor.execute("SELECT id FROM users")
            users = [i[0] for i in cursor.fetchall()]
        if dct:
            cursor.execute("SELECT ukr, rus FROM vocabulary")
            dictionary = alphabet_sort([(k, v) for k, v in cursor.fetchall()])
    

    提前谢谢。

    0 回复  |  直到 1 年前
        1
  •  -2
  •   Muhammad Yasir    1 年前

    您的方法在技术上是可行的,但它不是最有效或可扩展的方法,尤其是当数据库的大小增加时。持续查询数据库中可能未更改的数据可能会带来不必要的开销,并降低应用程序的速度。

    一种更有效的方法是实现缓存机制来存储以前检索到的数据,并且只在必要时查询数据库。您可以使用内存化等技术,也可以使用Redis等工具实现缓存层。

    以下是使用简单缓存机制修改的代码版本:

    # Import the necessary modules
    import mysql.connector
    
    # Initialize database connection
    db_connection = mysql.connector.connect(
        host="your_host",
        user="your_username",
        password="your_password",
        database="your_database"
    )
    cursor = db_connection.cursor()
    
    # Define global variables
    subscribers = []
    admins = []
    blacklist = []
    dictionary = {}
    users = []
    
    # Function to fetch data from the database or cache
    def fetch_data(query, cache):
        if cache is None:
            cursor.execute(query)
            return [i[0] for i in cursor.fetchall()]
        else:
            return cache
    
    # Function to update data
    def update(sub=False, adm=False, bkl=False, dct=False, usr=False) -> None:
        global subscribers, admins, blacklist, dictionary, users
    
        if sub:
            subscribers = fetch_data("SELECT id FROM users WHERE is_subscribed = TRUE", subscribers)
        if adm:
            admins = fetch_data("SELECT id FROM users WHERE is_admin = TRUE", admins)
        if bkl:
            blacklist = fetch_data("SELECT id FROM users WHERE is_banned = TRUE", blacklist)
        if usr:
            users = fetch_data("SELECT id FROM users", users)
        if dct:
            dictionary = fetch_data("SELECT ukr, rus FROM vocabulary", dictionary)
    
    # Example usage:
    update(sub=True, adm=True, bkl=True, dct=True, usr=True)