Il n'y a pas de type de liste dans sqlite3, donc par exemple, si vous voulez stocker une liste d'entiers, utilisez str ()
; pour la stocker dans une chaîne séparée (point-virgule) avec join ()
, et pour la récupérer, split () ) ʻEt ʻint ()
est requis.
Le module sqlite3 dispose d'un mécanisme pour enregistrer ces opérations à l'avance et les exécuter automatiquement si nécessaire.
Si vous savez que tous les types d'éléments de liste correspondent, vous pouvez gérer la liste de manière transparente en enregistrant la fonction de conversion en utilisant register_adapter ()
et register_converter ()
. ..
Dans l'exemple suivant, un type appelé ʻIntListest défini dans testtable, et la méthode de conversion avec le type de données python est enregistrée en utilisant
register_adapter ()et
register_converter ().
Detect_types = sqlite3.PARSE_DECLTYPES` est requis lors de la connexion.
test.py
import sqlite3
CREATE_TABLE = u"""
create table if not exists testtable (
id integer primary key,
intlist IntList
);
"""
IntList = list
sqlite3.register_adapter(IntList, lambda l: ';'.join([str(i) for i in l]))
sqlite3.register_converter("IntList", lambda s: [int(i) for i in s.split(';')])
def main():
con = sqlite3.connect(":memory:", detect_types = sqlite3.PARSE_DECLTYPES)
con.row_factory = sqlite3.Row
con.execute(CREATE_TABLE)
insert_list = [1,2,3]
con.execute(u'insert into testtable values(?, ?)', (1, insert_list))
con.commit()
cur = con.cursor()
cur.execute(u'select * from testtable;')
assert insert_list == cur.fetchone()['intlist']
if __name__ == '__main__':
main()
Bien sûr, register_adapter ()
et register_converter ()
peuvent également être utilisés avec des types définis par l'utilisateur.
Référence: http://docs.python.jp/2/library/sqlite3.html#id6
Recommended Posts