How to use Python cursor’s fetchall, fetchmany(), fetchone() to read records from SQL

This article demonstrates the use of Python’s cursor class methods fetchall, fetchmany(), fetchone() to retrieve rows from a database table. This article applies to all the relational databases, for example, MySQL, PostgreSQL.
We generally use the following Python module to work with Database.
- MySQL — — — — MySQL Connector Pytho
- PostgreSQL — — — — Psycopg2
- SQLite — — — — sqlite3
Above all, interfaces or modules are adhere to Python Database API Specification v2.0 (PEP 249). In this article, I will show how to use fetchall, fetchmany(), fetchone() to retrieve data from MySQL, PostgreSQL, SQLite database.
Before proceeding further first understand what is the use of fetchall(), fetchmany(), fetchone().
cursor.fetchall() returns all the rows of a query result. It returns all the rows as a list of tuples. An empty list is returned if there is no record to fetch.
cursor.fetchmany(size) returns the number of rows specified by size argument. When called repeatedly this method fetches the next set of rows of a query result and returns a list of tuples. If no more rows are available, it returns an empty list.
cursor.fetchone() method returns a single record or None if no more rows are available.
I have created a MySQL_Test table in my database. Now, it contains three rows. let see how to use fetchall to fetch all the records.
Let see the examples now.
Fetch all rows from the database table using cursor’s fetchall()
Now, let see how to use fetchall to fetch all the records. To fetch all rows from a database table, you need to follow these simple steps:
- Create a database Connection from Python.
- Define the SELECT query. Here you need to know the table, and it’s column details.
- Execute the SELECT query using the
cursor.execute()method. - Get resultSet (all rows) from the cursor object using a
cursor.fetchall(). - Iterate over the ResultSet using for loop and get columns values of each row.
- Close the Python database connection.
- Catch any SQL exceptions that may come up during the process.

import sqlite3
def getAllRecords():
try:
connection = sqlite3.connect('SqlTest.db')
cursor = connection.cursor()
print("Connected to SQLite")
sqlite_select_query = """SELECT * from database_score"""
cursor.execute(sqlite_select_query)
records = cursor.fetchall()
print("Total rows are: ", len(records))
print("Printing each row")
for row in records:
print("Name: ", row[0])
print("Email: ", row[1])
print("TestDate: ", row[2])
print("Score: ", row[3])
print("\n") cursor.close()
except sqlite3.Error as error:
print("Failed to read data from table", error)
finally:
if (connection):
connection.close()
print("The Sqlite connection is closed")
getAllRecords()Output:
Connected to SQLite
Total rows are: 3
Printing each rowName: Jacob
Email: [email protected]
TestDate: 2020/12/04
Score: 86
Name: Tim
Email: [email protected]
TestDate: 2020/12/06
Score: 84
Name: Jack
Email: [email protected]
TestDate: 2020/12/04
Score: 81
The Sqlite connection is closedRetrieve a few rows from a table using cursor.fetchmany(size)
One thing I like about Python DB API is the flexibility. In the real world, fetching all the rows at once may not be feasible. So Python DB API solves this problem by providing different versions of the fetch() function of the Cursor class. The most commonly used version is cursor.fetchmany(size).
Syntax:
rows = cursor.fetchmany([size=cursor.arraysize])- Here size is the number of rows to be retrieved. This method fetches the next set of rows of a query result and returns a list of tuples. If no more rows are available, it returns an empty list.
- Cursor’s
fetchmany()method returns the number of rows specified by size argument. the default value is 1. If the specified size is 100, then it returns 100 rows.
import sqlite3
def getlimitedRows(size):
try:
connection = sqlite3.connect('SqlTest.db')
cursor = connection.cursor()
print("Connected to database")
sqlite_select_query = """SELECT * from database_score"""
cursor.execute(sqlite_select_query)
records = cursor.fetchmany(size)
print("Fetching Total ", size," rows")
print("Printing each row")
for row in records:
print("Name: ", row[0])
print("Email: ", row[1])
print("TestDate: ", row[2])
print("Score: ", row[3])
print("\n")
cursor.close()
except sqlite3.Error as error:
print("Failed to read data from table", error)
finally:
if (connection):
connection.close()
print("The Sqlite connection is closed")
getlimitedRows(2)Output:
Connected to SQLite
Total rows are: 2
Printing each rowName: Jacob
Email: [email protected]
TestDate: 2020/12/04
Score: 86
Name: Tim
Email: [email protected]
TestDate: 2020/12/06
Score: 84
The Sqlite connection is closedNote:
- fetchmany() returns an empty list when no more rows are available in the table.
- A
ProgrammingErrorraised if the previous call to execute*() did not produce any result set or no call issued yet. fetchmany()returns fewer rows if the table contains the less number of rows specified by SIZE argument.
What will happen if the cursor’s fetchmany(size) called repeatedly
What will happen if we called cursor.fetchmany(size) repeatedly after executing a SQL query. For example, we ran a query, and it returned a query result of 10 rows. Next, we fetched the first 2 rows using cursor.fetchmany(2).
Again, we called the cursor.fetchmany(2) then it will return the next 2 rows.
Retrieve a single row from a table using cursor.fetchone
- Python DB API allows us to fetch only a single row. To fetch a single row from a result set we can use
cursor.fetchone(). This method returns a single tuple. - It can return a none if no rows are available in the resultset.
cursor.fetchone()increments the cursor position by one and return the next row.
Let see the example now.
import sqlite3def getSingleRows():
try:
connection = sqlite3.connect('SqlTest.db')
cursor = connection.cursor()
print("Connected to database") sqlite_select_query = """SELECT * from database_score"""
cursor.execute(sqlite_select_query)
print("Fetching single row")
record = cursor.fetchone()
print(record) print("Fetching next row")
record = cursor.fetchone()
print(record) cursor.close() except sqlite3.Error as error:
print("Failed to read data from table", error)
finally:
if (connection):
connection.close()
print("The Sqlite connection is closed")getSingleRows()Output:
Connected to database
Fetching single row
('Jacob', '[email protected]', '2020/12/04', 86)
Fetching next row
('Tim', '[email protected]', '2020/12/06', 84)The Sqlite connection is closed





