Вы передаете сфабрикованные имена в параметр форматирования строки для строки Unicode. В идеале, передаваемые таким образом строки также должны быть Unicode.
Но fabricate_hebrew_name не возвращает Unicode - ему возвращается строка в кодировке UTF-8, что не совпадает.
Итак, избавьтесь от вызова кодирования ('utf-8') и посмотрите, поможет ли это.
Следующий вопрос: какой тип runql ожидает. Если он ожидает Unicode, нет проблем. Если он ожидает ASCII-кодированную строку, то у вас будут проблемы, потому что иврит не ASCII. В маловероятном случае он ожидает кодированную строку UTF-8, тогда это время для его преобразования - после замены.
В другом ответе Игнасио Васкес-Абрамс предостерегает от интерполяции строк в запросах. Концепция здесь заключается в том, что вместо подстановки строк с использованием оператора% обычно следует использовать параметризованный запрос и передавать в него в качестве параметров строки на иврите. Это может иметь некоторые преимущества в оптимизации запросов и защите от внедрения SQL.
Пример
# -*- coding: utf-8 -*-
import sqlite3
# create db in memory
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE personal ("
"id INTEGER PRIMARY KEY,"
"name VARCHAR(42) NOT NULL)")
# insert random name
import random
fabricate_hebrew_name = lambda: random.choice([
u'ירדן',u'יפה',u'תמי',u'ענת', u'רבקה',u'טלי',u'גינה',u'דנה',u'ימית',
u'אלונה',u'אילן',u'אדם',u'חווה'])
cur.execute("INSERT INTO personal VALUES("
"NULL, :name)", dict(name=fabricate_hebrew_name()))
conn.commit()
id, name = cur.execute("SELECT * FROM personal").fetchone()
print id, name
# -> 1 אלונה