2010-10-21 6 views
3

J'essaie d'enregistrer un BLOB créé à partir d'un tableau d'entiers (c'est-à-dire un tableau condensé d'entiers) dans un DB SQLite. Le script ci-dessous donne le retraçage suivant. Pour autant que je puisse le voir à partir de la documentation de Python 2.7 sqlite3, il devrait être possible d'insérer un objet tampon dans une table, où il est supposé être sauvegardé en tant que BLOB. Cependant, je suis incapable de faire ce travail. (FWIW, isinstance (b, buffer) imprime True si inséré dans le script, donc je crée en effet un objet tampon.)Python 2.7, sqlite3, ValueError: impossible de convertir BLOB en tampon

Des suggestions?

Merci, -P.

Traceback (most recent call last): 
    File "example.py", line 13, in <module> 
    conn.execute('insert into foo values (?)', (b,)) # <=== line 14 
ValueError: could not convert BLOB to buffer 

import sqlite3 
import sys 
import array 

ar = array.array('I') 
ar.extend([1,0,3,11,43]) 
b = buffer(ar) 

conn = sqlite3.connect(':memory:') 
conn.execute('create table foo(bar BLOB)') 
conn.commit() 

conn.execute('insert into foo values (?)', (b,)) # <=== line 14 
conn.commit() 

Répondre

2

Note de Cristian Ciupitu sur le bug est correct, mais bytes(ar) vous donnera la représentation __str__ au lieu d'une sortie sérialisé. Par conséquent, utilisez ar.tostring().

Utilisez array.fromstring pour désérialiser le tableau à nouveau - vous devez créer un objet tableau avec le même type et ensuite appeler .fromstring(...).

+0

Vous avez raison. Utiliser 'bytes (ar)' dans Python 2.x n'est pas correct dans ce cas. –

+1

Merci. Cela marche. De plus, je l'ai trouvé que ce qui suit fonctionne aussi, et est équivalent: buf = tampon (ar) b = bytearray (BUF) blob = sqlite3.Binary (b) mais « b = ar.tostring() ", comme vous le suggérez, est un meilleur moyen d'obtenir b, et a la belle caractéristique que array.fromstring() fournit une manière symétrique de décoder les données lors de la lecture de la base de données. Merci encore, -P. –

+0

L'appel 'sqlite3.Binary' est identique à l'appel' buffer' (consultez le code source de 'sqlite3/dbapi2.py'). –