In sqlite3 gibt es keinen Listentyp. Wenn Sie beispielsweise eine Liste von Ganzzahlen speichern möchten, verwenden Sie "str ()", um sie in einer (durch Semikolon) getrennten Zeichenfolge mit "join ()" zu speichern. Sie müssen tun) und
int ()`.
Das sqlite3-Modul verfügt über einen Mechanismus, um diese Vorgänge im Voraus zu registrieren und bei Bedarf automatisch auszuführen.
Wenn Sie wissen, dass alle Typen der Listenelemente übereinstimmen, können Sie die Liste nahtlos verarbeiten, indem Sie die Konvertierungsfunktion mit "register_adapter ()" und "register_converter ()" registrieren. ..
Im folgenden Beispiel wird in testtable ein Typ namens "IntList" definiert und "register_adapter ()" und "register_converter ()" werden verwendet, um die Konvertierungsmethode mit dem Python-Datentyp zu registrieren.
Detect_types = sqlite3.PARSE_DECLTYPES
ist beim Herstellen einer Verbindung erforderlich.
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()
Natürlich können "register_adapter ()" und "register_converter ()" auch mit benutzerdefinierten Typen verwendet werden. Referenz: http://docs.python.jp/2/library/sqlite3.html#id6
Recommended Posts