Integrating with Databases (SQL)
Understand how to connect your scraping scripts to SQL databases (e.g., SQLite, PostgreSQL) for structured data storage.
Integrating with Databases (SQL) is a free Web Scraping & Bots lesson on CoddyKit — lesson 2 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Web Scraping & Bots learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
SQL for Scraped Data Storage
Welcome! After collecting data from the web, you need a reliable way to store it. While CSV or JSON files work for small tasks, databases offer powerful advantages for larger, more complex scraping projects.
This lesson explores how to integrate your Python scraping scripts with SQL databases like SQLite, a lightweight, file-based database perfect for local development.
Why Use SQL Databases?
Storing scraped data in a SQL database provides significant benefits over simple file storage:
- Structured Storage: Data is organized into tables with defined columns, ensuring consistency.
- Queryability: Easily search, filter, and analyze your data using SQL queries.
- Scalability: Handle large volumes of data more efficiently than flat files.
- Data Integrity: Enforce rules to prevent invalid or duplicate data entries.
SQL Basics: Tables, Rows, Columns
Think of a SQL database like a collection of spreadsheets. Each 'spreadsheet' is called a table. Each row in a spreadsheet is a row (or record) in a table, and each column is a column (or field).
For example, a 'products' table might have columns for name, price, and url.
Connecting to SQLite in Python
Python has a built-in module, sqlite3, that allows you to interact with SQLite databases. First, you need to establish a connection.
Run this code to see how to connect to and then close a database file named scraped_data.db.
import sqlite3
def connect_to_db(db_name="scraped_data.db"):
conn = None
try:
# Connects to the database file. If it doesn't exist, it creates it.
conn = sqlite3.connect(db_name)
print(f"Successfully connected to {db_name}")
except sqlite3.Error as e:
print(f"Database connection error: {e}")
finally:
if conn:
# Always close the connection when done
conn.close()
print("Connection closed.")
if __name__ == "__main__":
connect_to_db()Creating Your First Table
Once connected, you need to define the structure for your data. This is done by creating a table using a SQL CREATE TABLE statement. We'll use a cursor object to execute SQL commands.
This example creates a products table with an ID, name, price, and URL column.
import sqlite3
def create_products_table(db_name="scraped_data.db"):
conn = None
try:
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
# SQL command to create a table if it doesn't already exist
cursor.execute("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL,
url TEXT UNIQUE
)
""")
conn.commit() # Save the changes to the database
print("Table 'products' created or already exists.")
except sqlite3.Error as e:
print(f"Database error: {e}")
finally:
if conn:
conn.close()
if __name__ == "__main__":
create_products_table()Inserting Scraped Data
After creating your table, you can start adding the data you've scraped. The SQL INSERT INTO statement is used for this. It's crucial to use parameterized queries (with ? placeholders) to prevent SQL injection vulnerabilities.
Let's add a single product to our table.
import sqlite3
def insert_product(db_name="scraped_data.db", name="Sample Product", price=99.99, url="http://example.com/sample"):
conn = None
try:
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
# SQL to insert a single row
cursor.execute("INSERT INTO products (name, price, url) VALUES (?, ?, ?)",
(name, price, url))
conn.commit()
print(f"Inserted product: {name}")
except sqlite3.Error as e:
print(f"Database error: {e}")
finally:
if conn:
conn.close()
if __name__ == "__main__":
# Ensure table exists before inserting
conn_temp = sqlite3.connect("scraped_data.db")
cursor_temp = conn_temp.cursor()
cursor_temp.execute("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL,
url TEXT UNIQUE
)
""")
conn_temp.commit()
conn_temp.close()
insert_product(name="Python Book", price=35.50, url="http://bookstore.com/python")Inserting Multiple Records Efficiently
When you have many scraped items to save, inserting them one by one can be slow. The cursor.executemany() method allows you to insert multiple rows with a single command, making the process much faster.
Provide a list of tuples, where each tuple represents a row to be inserted.
import sqlite3
def insert_multiple_products(db_name="scraped_data.db", products_data=None):
if products_data is None:
products_data = [
("Mechanical Keyboard", 120.00, "http://shop.com/mech-kb"),
("Gaming Mouse", 65.99, "http://shop.com/gaming-mouse"),
("Webcam HD", 49.99, "http://shop.com/webcam")
]
conn = None
try:
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
# Use executemany for bulk inserts
cursor.executemany("INSERT INTO products (name, price, url) VALUES (?, ?, ?)",
products_data)
conn.commit()
print(f"Inserted {len(products_data)} products.")
except sqlite3.Error as e:
print(f"Database error: {e}")
finally:
if conn:
conn.close()
if __name__ == "__main__":
# Ensure table exists before inserting
conn_temp = sqlite3.connect("scraped_data.db")
cursor_temp = conn_temp.cursor()
cursor_temp.execute("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL,
url TEXT UNIQUE
)
""")
conn_temp.commit()
conn_temp.close()
insert_multiple_products()Handling Existing Data (Updates/Ignores)
What if you scrape data that might already be in your database? You generally have two options:
- Ignore Duplicates: Use
INSERT OR IGNORE INTOSQL syntax if a unique constraint (like oururl TEXT UNIQUE) would be violated. - Update Existing: Use the
UPDATESQL statement to modify an existing record instead of inserting a new one if a match is found.
Choosing the right strategy depends on whether new data should overwrite old, or if old data should simply be kept.
Robust Interactions: Commit & Close
Always remember to:
conn.commit(): This saves your changes (like inserts or updates) to the database file. Without it, your changes might not persist!conn.close(): Close the database connection when you're done. This frees up resources and ensures data integrity.- Error Handling: Wrap your database operations in
try...except...finallyblocks to catch errors and ensure the connection is always closed, even if an error occurs.
Quick Check: SQL Data Insert
You've learned how to connect to a database and insert data. Which Python method is best suited for inserting many rows of data into a SQL table in one go?
Recap: SQL for Persistence
Great job! You now understand the fundamentals of integrating your web scraping scripts with SQL databases.
We covered:
- The benefits of databases for scraped data.
- Connecting to SQLite using Python's
sqlite3. - Creating tables with
CREATE TABLE. - Inserting single and multiple records using
INSERT INTOandexecutemany(). - Best practices like
commit()andclose().
This knowledge is vital for building robust and scalable scraping solutions!
Frequently asked questions
Is the “Integrating with Databases (SQL)” lesson free?
Yes — the full text of “Integrating with Databases (SQL)” is free to read here on the web, and the Web Scraping & Bots course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Web Scraping & Bots course, upgrade to CoddyKit PRO.
What will I learn in “Integrating with Databases (SQL)”?
Understand how to connect your scraping scripts to SQL databases (e.g., SQLite, PostgreSQL) for structured data storage. You practise Web Scraping & Bots with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start Web Scraping & Bots?
No prior experience is required. Web Scraping & Bots on CoddyKit is structured for beginners through advanced learners; this is — lesson 2 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Integrating with Databases (SQL)” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this Web Scraping & Bots lesson?
Yes. Every Web Scraping & Bots lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Storing Data in CSV/JSON
- Integrating with Databases (SQL)
- Cloud Storage Solutions
- Storing Data in NoSQL Databases