Pandas helps you easily get data from SQL databases and work with it in Python. This makes data analysis faster and simpler.
Pandas with SQL databases
import pandas as pd from sqlalchemy import create_engine # Create a database connection engine = create_engine('sqlite:///mydatabase.db') # Read SQL query or table into a DataFrame df = pd.read_sql('SELECT * FROM tablename', engine) # Write DataFrame back to SQL table df.to_sql('new_table', engine, if_exists='replace', index=False)
Use create_engine from SQLAlchemy to connect to your database.
pd.read_sql() can take a SQL query or a table name to load data.
import pandas as pd from sqlalchemy import create_engine engine = create_engine('sqlite:///example.db') df = pd.read_sql('SELECT * FROM users', engine) print(df.head())
df into a new table called 'backup_users' in the database, replacing it if it exists.df.to_sql('backup_users', engine, if_exists='replace', index=False)
query = 'SELECT name, age FROM users WHERE age > 30' df = pd.read_sql(query, engine) print(df)
This program creates a small employees table in a temporary database, loads it into pandas, updates salaries for IT staff, saves changes back, and reads the updated table.
import pandas as pd from sqlalchemy import create_engine # Create an in-memory SQLite database engine = create_engine('sqlite:///:memory:') # Create a sample table and insert data with engine.connect() as conn: conn.execute(""" CREATE TABLE employees ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, department TEXT, salary INTEGER ) """) conn.execute(""" INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 70000), ('Bob', 'IT', 80000), ('Charlie', 'Finance', 75000) """) # Read the table into a pandas DataFrame df = pd.read_sql('SELECT * FROM employees', engine) # Show the DataFrame print(df) # Increase salary by 10% for IT department df.loc[df['department'] == 'IT', 'salary'] = df.loc[df['department'] == 'IT', 'salary'] * 1.10 # Save updated data back to SQL df.to_sql('employees', engine, if_exists='replace', index=False) # Read again to confirm changes df_updated = pd.read_sql('SELECT * FROM employees', engine) print(df_updated)
Make sure to install SQLAlchemy with pip install sqlalchemy to use create_engine.
When writing DataFrames back to SQL, use if_exists='replace' to overwrite or if_exists='append' to add data.
SQLite is great for testing, but for bigger projects use databases like PostgreSQL or MySQL.
Pandas can read from and write to SQL databases easily using read_sql and to_sql.
Use SQLAlchemy's create_engine to connect pandas to your database.
This lets you combine SQL's power with pandas' easy data analysis in Python.
Practice
pandas.read_sql() when working with SQL databases?Solution
Step 1: Understand the function purpose
pandas.read_sql()is designed to read data from a SQL query or table.Step 2: Match function to action
Reading data means loading it into a pandas DataFrame for analysis.Final Answer:
To read data from a SQL database into a pandas DataFrame -> Option AQuick Check:
read_sql() = read data [OK]
- Confusing read_sql with to_sql
- Thinking it creates or deletes databases
- Assuming it writes data instead of reading
data.db using SQLAlchemy for pandas?Solution
Step 1: Recall SQLite connection string format
SQLite uses the format 'sqlite:///' followed by the database file path.Step 2: Match correct syntax
engine = create_engine('sqlite:///data.db') uses 'sqlite:///data.db' which is the correct format for a local file.Final Answer:
engine = create_engine('sqlite:///data.db') -> Option BQuick Check:
SQLite engine needs three slashes [OK]
- Using two slashes instead of three
- Missing slashes or colon
- Confusing with other database connection formats
print(df.shape)?
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('sqlite:///test.db')
df = pd.read_sql('SELECT * FROM users WHERE age > 30', engine)Solution
Step 1: Understand the SQL query
The query selects all columns from 'users' where age is greater than 30, so only matching rows are returned.Step 2: Understand pandas DataFrame shape
The DataFrame shape is (rows, columns). Rows = filtered rows, columns = all columns from 'users'.Final Answer:
(number_of_rows_with_age_greater_than_30, number_of_columns_in_users_table) -> Option DQuick Check:
Filtered rows and all columns = shape [OK]
- Assuming all rows are returned
- Thinking shape returns data content
- Confusing SQL syntax with pandas syntax
df to a SQL table named sales?
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db')
df.to_sql('sales', engine)Solution
Step 1: Check to_sql default behavior
By default,to_sqlwill raise an error if the table exists unlessif_existsis set.Step 2: Identify missing argument
The code lacksif_exists='replace'orif_exists='append'to avoid errors on existing tables.Final Answer:
Missing the argument if_exists to handle existing tables -> Option AQuick Check:
to_sql needs if_exists for existing tables [OK]
- Assuming to_sql always overwrites
- Thinking engine string is wrong
- Believing DataFrame must convert before writing
status = 'active', and then write only these filtered rows back to a new SQL table named active_users. Which sequence of commands correctly achieves this?Solution
Step 1: Read all data and filter in pandas
df = pd.read_sql('SELECT * FROM users', engine) df_filtered = df[df['status'] == 'active'] df_filtered.to_sql('active_users', engine, if_exists='replace') reads all users, then filters rows where status equals 'active' using correct pandas syntax.Step 2: Write filtered data with proper if_exists argument
df = pd.read_sql('SELECT * FROM users', engine) df_filtered = df[df['status'] == 'active'] df_filtered.to_sql('active_users', engine, if_exists='replace') writes filtered data to 'active_users' table, replacing if it exists, avoiding errors.Final Answer:
df = pd.read_sql('SELECT * FROM users', engine) df_filtered = df[df['status'] == 'active'] df_filtered.to_sql('active_users', engine, if_exists='replace') -> Option CQuick Check:
Read all, filter in pandas, write with if_exists [OK]
- Incorrect SQL syntax in WHERE clause
- Using single equals (=) in pandas filter
- Missing if_exists argument causing errors
Ready to prove it?
Pass the test and this pattern moves unknown
