Другой пример параметризованного запроса ...
Для ситуации, когда вы должны предоставить свою собственную функцию REGEX для базы данных - я думаю, что Python sqlite3 не всегда имеет ее настроенную по умолчанию.
В другом примере пользовательская функция REGEX компилирует одно и то же выражение для каждого совпадения. Есть способ обойти это. В приведенном ниже примере также есть комментарий в нижней части другого способа определения операции REGEX.
Вы можете обойтись без компиляции выражения каждый раз, когда выражение используется (для каждого совпадения) для запросов, связанных с большим количеством данных, создавая пользовательскую функцию для каждого запроса и компилируя выражение только один раз . Ниже self._conn - соединение с базой данных, а curs - курсор от него.
# Form an expression to match nicknames with the last 3 characters
# varying.
nick_expr = re.sub(r"[0-9_\-|]{0,3}$", r"[0-9_\-|]{0,3}$", nick)
nick_expr = re.compile(nick_expr, re.I)
# Create custom sqlite3 function using the compiled expression.
self._conn.create_function("NICKEXPR",
1,
lambda nick: nick_expr.match(nick) != None)
# Create temporary table from first pass query.
curs.execute(
""" CREATE TEMP TABLE temp_table1 AS
SELECT DISTINCT *
FROM users
WHERE NICKEXPR(nick)
OR host LIKE ?
OR (account<>'' AND account LIKE ?)
OR (address<>'' AND address=?)
""", (host, account, address))
# Set up the REGEXP operator/function for the sqlite3 database.
#self._conn.create_function(
# 'REGEXP', 2,
# lambda exp, item : re.find(exp, item) != None)