import sqlite3

def func_to_register(args):
  ...

with sqlite3.connect('example.db') as conn:
  #register the function
  conn.create_function('func_name', 1, func_to_register)
  ...
  cursor.execute('SELECT func_name(a), func_name(b) FROM example;')
  ...

 

sqlite3 module provides a Python interface to use and manage SQLite database.  In this article we will look on how we can use Python functions in SQL statements when querying an SQLite database. 

SQL allows function to be used in statements to process data before it is returned. Particularly, SQL functions are allowed either in the WHERE clause of the SELECT statement or in column lists.

To allow Python functions to be used in SQL queries, we will need to register that function using the create_function() method of connection objects.

Basic example

Consider if we have an SQLite database for storing student details. The following example creates the students database:

import sqlite3

with sqlite3.connect('students.db') as conn:
  try:
    conn.execute(
      '''
        CREATE TABle student (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          fname TEXT,
          lname TEXT,
          college TEXT
          );
      ''')
    print('Table student created Successfully')
    conn.executescript('''
        INSERT INTO student(fname, lname, college) VALUES ('john', 'doe', 'havard');
        INSERT INTO student (fname, lname, college) VALUES ('jane', 'smith', 'reeds');
        INSERT INTO student (fname, lname, college) VALUES ('mary', 'gates', 'havard');
      ''')
    print('Rows Inserted Successfully.')
  except ZeroDivisionError:
    print('Something went wrong!')

Table student created Successfully
Rows Inserted Successfully.

retrieve data:

import sqlite3

with sqlite3.connect('students.db') as conn:
  cursor = conn.cursor()
  cursor.execute('SELECT fname, lname, college FROM student;')
  for row in cursor:
    print(row)

('john', 'doe', 'havard')
('jane', 'smith', 'reeds')
('mary', 'gates', 'havard')

Register a function

Consider if we want to retrieve the students from the database with the student names being capitalized and the name of school in upper case and without updating the columns in database. We can define and register two functions as shown below.

import sqlite3

def transform_upper(s):
  return s.upper()

def capitalize(s):
  return s.capitalize()

with sqlite3.connect('students.db') as conn:
  #register the functions
  conn.create_function('transform_upper', 1, transform_upper)
  conn.create_function('capitalize', 1, capitalize)

  cursor = conn.cursor()
  cursor.execute('SELECT capitalize(fname), capitalize(lname), transform_upper(college) FROM student;')
  for row in cursor:
    print(row)

('John', 'Doe', 'HAVARD')
('Jane', 'Smith', 'REEDS')
('Mary', 'Gates', 'HAVARD')

In the above example we defined and registered two functions transform_upper and capitalize, we then used the functions in the SELECT query to capitalize the student names and transform the name of the school to uppercase.  Of course, SQL provides native functions for basic operations such as UPPER to capitalize a value.

The conn.create_function() creates an sql function from a Python function. Its basic syntax is shown below:

conn.create_function(name, nargs, func)

The name parameter is the name of the function as it will appear in the sql queries.

The nargs parameter is the number of arguments taken by the function.

The func parameter is the actual Python function.