Python Data Science Jobs & Interviews
20.4K subscribers
188 photos
4 videos
25 files
328 links
Your go-to hub for Python and Data Science—featuring questions, answers, quizzes, and interview tips to sharpen your skills and boost your career in the data-driven world.

Admin: @Hussein_Sheikho
Download Telegram
Q: How can you implement a thread-safe, connection-pooling mechanism using Python's sqlite3 with concurrent.futures.ThreadPoolExecutor, while ensuring atomic transactions and handling database schema migrations dynamically? Provide a complete example with error handling and logging.

A:
import sqlite3
import threading
import logging
from concurrent.futures import ThreadPoolExecutor, as_completed
from contextlib import contextmanager
import os
import time

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Database path
DB_PATH = "example.db"

# Schema definition
SCHEMA = """
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL
);
"""

# Connection pool with threading
class DatabaseConnectionPool:
def __init__(self, db_path, max_connections=5):
self.db_path = db_path
self.max_connections = max_connections
self._connections = []
self._lock = threading.Lock()

def get_connection(self):
with self._lock:
if self._connections:
return self._connections.pop()
else:
return sqlite3.connect(self.db_path)

def release_connection(self, conn):
with self._lock:
if len(self._connections) < self.max_connections:
self._connections.append(conn)
else:
conn.close()

def close_all(self):
with self._lock:
for conn in self._connections:
conn.close()
self._connections.clear()

@contextmanager
def get_db_connection(pool):
conn = pool.get_connection()
try:
yield conn
except Exception as e:
conn.rollback()
logger.error(f"Database error: {e}")
raise
finally:
pool.release_connection(conn)

def execute_transaction(pool, query, params=None):
with get_db_connection(pool) as conn:
cursor = conn.cursor()
cursor.execute(query, params or ())
conn.commit()

def create_user(pool, name, email):
query = "INSERT INTO users (name, email) VALUES (?, ?)"
try:
execute_transaction(pool, query, (name, email))
logger.info(f"User {name} created.")
except sqlite3.IntegrityError:
logger.warning(f"Email {email} already exists.")

def fetch_users(pool):
query = "SELECT id, name, email FROM users"
with get_db_connection(pool) as conn:
cursor = conn.cursor()
cursor.execute(query)
return cursor.fetchall()

def schema_migration(pool, new_schema):
with get_db_connection(pool) as conn:
cursor = conn.cursor()
cursor.executescript(new_schema)
conn.commit()
logger.info("Schema migration applied.")

# Example usage
if __name__ == "__main__":
# Initialize pool
pool = DatabaseConnectionPool(DB_PATH)

# Apply schema
schema_migration(pool, SCHEMA)

# Simulate concurrent user creation
names_emails = [("Alice", "[email protected]"), ("Bob", "[email protected]")]

with ThreadPoolExecutor(max_workers=4) as executor:
futures = [
executor.submit(create_user, pool, name, email)
for name, email in names_emails
]
for future in as_completed(futures):
try:
future.result()
except Exception as e:
logger.error(f"Task failed: {e}")

# Fetch results
users = fetch_users(pool)
logger.info(f"Users: {users}")

# Cleanup
pool.close_all()

#Python #SQLite #Database #Multithreading #ThreadSafety #ConnectionPooling #AtomicTransactions #SchemaMigration #Concurrency #Programming #AdvancedPython

By: @DataScienceQ 🚀
Q: How can you create a simple Python script to manage a SQLite database for storing and retrieving user information, including adding new users, displaying all users, and searching by name? Provide a step-by-step example with basic error handling.

A:
import sqlite3

# Connect to database (creates if not exists)
conn = sqlite3.connect('users.db')
cursor = conn.cursor()

# Create table
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL
)
''')
conn.commit()

# Add user function
def add_user(name, email):
try:
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", (name, email))
conn.commit()
print(f"User {name} added.")
except sqlite3.Error as e:
print(f"Error: {e}")

# Display all users
def show_users():
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
if users:
for user in users:
print(f"ID: {user[0]}, Name: {user[1]}, Email: {user[2]}")
else:
print("No users found.")

# Search user by name
def search_user(name):
cursor.execute("SELECT * FROM users WHERE name LIKE ?", ('%' + name + '%',))
results = cursor.fetchall()
if results:
for user in results:
print(f"ID: {user[0]}, Name: {user[1]}, Email: {user[2]}")
else:
print("No user found.")

# Example usage
add_user("Alice", "[email protected]")
add_user("Bob", "[email protected]")

print("\nAll users:")
show_users()

print("\nSearching for 'Alice':")
search_user("Alice")

# Close connection
conn.close()

#Python #SQLite #Databases #Beginner #Programming #DatabaseManagement #SimpleCode #DataStorage #LearningPython

By: @DataScienceQ 🚀
1. What is a database?
2. Why do we use databases in Python?
3. Name a popular database library for Python.
4. How do you connect to a SQLite database in Python?
5. What is the purpose of cursor() in database operations?
6. How do you execute a query in Python using SQLite?

---

Explanation with Code Example (Beginner Level):

import sqlite3

# 1. Create a connection to a database (or create it if not exists)
conn = sqlite3.connect('example.db')

# 2. Create a cursor object to interact with the database
cursor = conn.cursor()

# 3. Create a table
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
)
''')

# 4. Insert data into the table
cursor.execute("INSERT INTO users (name, age) VALUES ('Alice', 25)")
cursor.execute("INSERT INTO users (name, age) VALUES ('Bob', 30)")

# 5. Commit changes
conn.commit()

# 6. Query the data
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)

# Close connection
conn.close()

This example shows how to:
- Connect to a SQLite database.
- Create a table.
- Insert and retrieve data.

Answer:
1. A database is an organized collection of data.
2. We use databases to store, manage, and retrieve data efficiently.
3. sqlite3 is a popular library.
4. Use sqlite3.connect() to connect.
5. cursor() allows executing SQL commands.
6. Use cursor.execute() to run queries.

#Python #Databases #SQLite #Beginner #Programming #Coding #LearnToCode

By: @DataScienceQ 🚀
1