pythondatabasesqlitesqlite3-python

Is it possible in SQlite3 python that if a row has been previously updated, it cannot be updated for like 5 seconds


In a database table, if a specific row has been previously modified or updated, I want that row to not be changed or cannot be modified for let's say I set in 5 seconds even if the program is trying to modify that row, then after that the row can be modified or update again. Is that possible?

I didn't try anything yet because I dont have an idea if it is possible or not


Solution

  • Yes this is possible. To implement this kind of behaviour you can add a new column to your table let's call it last_modified. Which get's a default value of the current timestamp

    CREATE TABLE your_table (
        ...
        last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    

    or

    ALTER TABLE your_table ADD COLUMN last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
    

    Now each time you want to update your table you check if the affected row has been updated in the last 5 seconds if not update the row if yes throw an error.

    import sqlite3
    import time
    
    # Connect to the SQLite database
    conn = sqlite3.connect('your_database.db')
    cursor = conn.cursor()
    
    # Create the table if it doesn't exist
    cursor.execute('''CREATE TABLE IF NOT EXISTS your_table
                      (id INTEGER PRIMARY KEY AUTOINCREMENT,
                       column1 TEXT,
                       column2 TEXT,
                       last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
    
    # Function to check if a row can be modified
    def can_modify_row(row_id, interval):
        cursor.execute("SELECT ROUND((JULIANDAY('now') - JULIANDAY(last_modified)) * 86400) FROM your_table WHERE id = ?", (row_id,))
        elapsed_time = cursor.fetchone()[0]
        return elapsed_time > interval
    
    # Update a row, setting the last_modified timestamp to the current time
    def update_row(row_id, column1_value, column2_value):
        cursor.execute("UPDATE your_table SET column1 = ?, column2 = ?, last_modified = CURRENT_TIMESTAMP WHERE id = ?", (column1_value, column2_value, row_id))
        conn.commit()
    
    # Example usage
    row_id = 1
    interval = 5  # seconds
    
    if can_modify_row(row_id, interval):
        print("Modifying the row...")
        update_row(row_id, "new_value1", "new_value2")
    else:
        print("Cannot modify the row yet. Please try again later.")
    
    # Close the database connection
    conn.close()
    

    The code is currently untested, but I hope you get the idea