Python
import subprocess
def run_sql(query):
subprocess.run(["psql", "todo_app", "-c", query])
def run_sql_block(sql_block):
subprocess.run(["psql", "todo_app"], input=sql_block.encode())
def create_db():
subprocess.run(["createdb", "todo_app"], stderr=subprocess.DEVNULL)
def create_table():
run_sql("""
CREATE TABLE IF NOT EXISTS todos (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
completed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
completed_at TIMESTAMP
);
""")
def view_todos():
run_sql("SELECT id, title, completed, created_at, completed_at FROM todos ORDER BY id;")
def add_todo():
title = input("Enter title: ")
run_sql(f"INSERT INTO todos (title) VALUES ('{title}');")
view_todos()
def toggle_todo():
id_ = input("Enter ID to toggle: ")
sql_block = f"""
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM todos WHERE id = {id_} AND completed = FALSE) THEN
UPDATE todos SET completed = TRUE, completed_at = NOW() WHERE id = {id_};
ELSIF EXISTS (SELECT 1 FROM todos WHERE id = {id_} AND completed = TRUE) THEN
UPDATE todos SET completed = FALSE, completed_at = NULL WHERE id = {id_};
ELSE
RAISE NOTICE 'Todo with ID % not found.', {id_};
END IF;
END
$$;
"""
run_sql_block(sql_block)
view_todos()
def delete_todo():
id_ = input("Enter ID to delete: ")
run_sql(f"DELETE FROM todos WHERE id = {id_};")
view_todos()
def main():
create_db()
create_table()
print("Welcome to todo list in postgres (python)")
view_todos()
while True:
print("\n1. View todos\n2. Add todo\n3. Toggle completed\n4. Delete todo\n5. Exit")
choice = input("Choose an option: ")
if choice == "1":
view_todos()
elif choice == "2":
add_todo()
elif choice == "3":
toggle_todo()
elif choice == "4":
delete_todo()
elif choice == "5":
print("Goodbye!")
break
else:
print("Invalid option.")
if __name__ == "__main__":
main()