Executing SQL Queries and Handling Data in Python

Python has become one of the most popular programming languages for handling and analyzing data, and it offers extensive support for working with databases. One of the core tasks when working with databases is executing SQL queries and manipulating the retrieved data. In this article, we will explore how to execute SQL queries in Python and handle the returned data efficiently.

Connecting to a Database

Before executing any SQL query, we need to establish a connection to the database. Python provides various libraries for connecting to different types of databases, such as sqlite3, psycopg2 for PostgreSQL, pymysql for MySQL, and more. Here, we will focus on the sqlite3 library, which is included in Python's standard library and allows us to work with SQLite databases.

To connect to a database, we can use the connect() method from the sqlite3 module, providing the database path as an argument:

import sqlite3

conn = sqlite3.connect('example.db')

Executing SQL Queries

Once connected to the database, we can execute SQL queries using the connection object's execute() method. Let's consider an example where we have a table named users with columns id, name, and age.

To retrieve all rows from the users table, we can execute a simple SELECT query:

cursor = conn.execute('SELECT * FROM users')

The execute() method returns a cursor object, which allows us to fetch the result set. We can iterate over the cursor object to retrieve each row of data:

for row in cursor:

Fetching Data

By default, the cursor object returns a tuple for each row, with each element containing the corresponding column's value. We can access these values using indexing, like row[0], row[1], and so on. However, it's recommended to use named tuples or dictionaries for better readability and code maintainability.

To fetch rows as named tuples, we can set the row_factory attribute of the connection object to sqlite3.Row:

conn.row_factory = sqlite3.Row
cursor = conn.execute('SELECT * FROM users')

for row in cursor:
    print(row['name'], row['age'])

Alternatively, we can use the fetchall() method to retrieve all rows as a list of dictionaries:

cursor = conn.execute('SELECT * FROM users')
rows = cursor.fetchall()

for row in rows:
    print(row['name'], row['age'])

Parameterized Queries

To prevent SQL injection attacks and make our queries more secure, we should use parameterized queries. Instead of directly inserting values into the query string, we can pass them as parameters:

name = 'John'
age = 30

cursor.execute('SELECT * FROM users WHERE name=? AND age=?', (name, age))

By substituting placeholders with question marks, we avoid any potential security vulnerabilities.


Python provides powerful tools for executing SQL queries and efficiently handling data from databases. We explored connecting to a database, executing queries, fetching data, and using parameterized queries. Using these techniques, you can leverage the full potential of Python for database operations and effectively work with data in your applications.

noob to master © copyleft