Python, Sqlite3 – Как преобразовать список в ячейку BLOB

Что является самым элегантным методом для сброса списка в python в sqlite3 DB в виде двоичных данных (т. Е. Ячейки BLOB)?

data = [ 0, 1, 2, 3, 4, 5 ] # now write this to db as binary data # 0000 0000 # 0000 0001 # ... # 0000 0101 

  • Возможно ли заблокировать файл sqlite в файловой системе NFS?
  • Как преобразовать десятичное число Python в числовое число SQLite?
  • Настройка каталога хранилища SQL-файлов
  • Подстановка SQLite и кавычки
  • Создание таблицы в базе данных Sqlite с помощью Genie?
  • sqlite3.OperationalError: непризнанный токен: «01T00» Python datestamp
  • Как создать или открыть базу данных со значением, хранящимся в переменной
  • Что такое эффективный способ вставки тысяч записей в таблицу SQLite с помощью Django?
  • 5 Solutions collect form web for “Python, Sqlite3 – Как преобразовать список в ячейку BLOB”

    Предполагая, что вы хотите, чтобы он рассматривался как последовательность 8-разрядных значений без знака, используйте модуль array .

     a = array.array('B', data) >>> a.tostring() '\x00\x01\x02\x03\x04\x05' 

    Используйте разные типы типов, чем 'B' если вы хотите обрабатывать данные как разные типы. например. 'b' для последовательности подписанных байтов, или 'i' для целого числа со знаком.

    Похоже, решение Брайана соответствует вашим потребностям, но имейте в виду, что с помощью этого метода вы просто храните данные в виде строки.

    Если вы хотите хранить необработанные двоичные данные в базе данных (так что это занимает не так много места), преобразуйте свои данные в объект двоичного sqlite и затем добавьте его в свою базу данных.

     query = u'''insert into testtable VALUES(?)''' b = sqlite3.Binary(some_binarydata) cur.execute(query,(b,)) con.commit() 

    (По какой-то причине это, похоже, не документируется в документации на python)

    Ниже приведены некоторые примечания по ограничениям данных BLOB в sqlite:

    http://effbot.org/zone/sqlite-blob.htm

    У меня такая же проблема, и я думаю о решении этого по-другому.

    Я думаю, что модуль рассола выполняется точно для чего-то подобного (сериализация на объектах python)

    Пример (этот для сбрасывания файлов … но я думаю, что это легко изменить для хранения db)

    Сохранение:

     # Save a dictionary into a pickle file. import pickle favorite_color = { "lion": "yellow", "kitty": "red" } pickle.dump( favorite_color, open( "save.p", "w" ) ) 

    Загрузка:

     # Load the dictionary back from the pickle file. import pickle favorite_color = pickle.load( open( "save.p" ) ) 

    IMHO Я думаю, что этот способ более изящный и безопасный (он работает для любого объекта python).

    Это мои 2 цента

    ОБНОВЛЕНИЕ: после небольшого поиска по моей идее , они показывают некоторые исправления в моем решении (я не могу делать запросы sql в этом поле). Но я все еще думаю, что это достойное решение (если вам не нужно искать это поле.

    См. Это общее решение в SourceForge, которое охватывает любой произвольный объект Python (включая список, кортеж, словарь и т. Д.):

    Модуль y_serial.py :: хранилища объектов Python с SQLite

    «Сериализация + персистентность :: в нескольких строках кода, сжатие и аннотирование объектов Python в SQLite, а затем в хронологическом порядке восстановить их по ключевым словам без SQL. Самый полезный« стандартный »модуль для базы данных для хранения данных без схемы».

    http://yserial.sourceforge.net

    Можно хранить данные объекта как дамп pickle, jason и т. Д., Но также можно индексировать, их, ограничивать и запускать запросы выбора, которые используют эти индексы. Вот пример с кортежами, который можно легко применить для любого другого класса python. Все, что необходимо, объясняется в документации python sqlite3 (кто-то уже разместил ссылку). В любом случае, здесь все собрано в следующем примере:

     import sqlite3 import pickle def adapt_tuple(tuple): return pickle.dumps(tuple) sqlite3.register_adapter(tuple, adapt_tuple) #cannot use pickle.dumps directly because of inadequate argument signature sqlite3.register_converter("tuple", pickle.loads) def collate_tuple(string1, string2): return cmp(pickle.loads(string1), pickle.loads(string2)) ######################### # 1) Using declared types con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) con.create_collation("cmptuple", collate_tuple) cur = con.cursor() cur.execute("create table test(p tuple unique collate cmptuple) ") cur.execute("create index tuple_collated_index on test(p collate cmptuple)") cur.execute("select name, type from sqlite_master") # where type = 'table'") print(cur.fetchall()) p = (1,2,3) p1 = (1,2) cur.execute("insert into test(p) values (?)", (p,)) cur.execute("insert into test(p) values (?)", (p1,)) cur.execute("insert into test(p) values (?)", ((10, 1),)) cur.execute("insert into test(p) values (?)", (tuple((9, 33)) ,)) cur.execute("insert into test(p) values (?)", (((9, 5), 33) ,)) try: cur.execute("insert into test(p) values (?)", (tuple((9, 33)) ,)) except Exception as e: print e cur.execute("select p from test order by p") print "\nwith declared types and default collate on column:" for raw in cur: print raw cur.execute("select p from test order by p collate cmptuple") print "\nwith declared types collate:" for raw in cur: print raw con.create_function('pycmp', 2, cmp) print "\nselect grater than using cmp function:" cur.execute("select p from test where pycmp(p,?) >= 0", ((10, ),) ) for raw in cur: print raw cur.execute("select p from test where pycmp(p,?) >= 0", ((3,))) for raw in cur: print raw print "\nselect grater than using collate:" cur.execute("select p from test where p > ?", ((10,),) ) for raw in cur: print raw cur.execute("explain query plan select p from test where p > ?", ((3,))) for raw in cur: print raw cur.close() con.close() 
    Python - лучший язык программирования в мире.