python de l'insertion et de la récupération de données binaires dans mysql
Je suis en utilisant le MySQLdb paquet pour interagir avec MySQL. Je vais avoir de la difficulté à obtenir le bon type de conversions.
Je suis l'aide d'une binaire de 16 octets uuid comme une clé primaire pour la table et à mediumblob holding zlib comprimé json de l'information.
Je suis en utilisant le schéma suivant:
CREATE TABLE repositories (
added_id int auto_increment not null,
id binary(16) not null,
data mediumblob not null,
create_date int not null,
update_date int not null,
PRIMARY KEY (added_id),
UNIQUE(id)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ENGINE=InnoDB;
Puis-je créer une nouvelle ligne dans la table en utilisant le code suivant:
data = zlib.compress(json.dumps({'hello':'how are you :D'})
row_id = uuid.uuid(4).hex
added_id = cursor.execute('
INSERT INTO repositories (id, data, create_date, update_date)
VALUES (%s, %s, %s, %s)',
binascii.a2b_hex(row_id),
data,
time.time(),
time.time()
)
Puis de récupérer les données, j'utilise une requête similaire:
query = cursor.execute('SELECT added_id, id, data, create_date, update_date ' \
'FROM repositories WHERE id = %s',
binascii.a2b_hex(row_id)
)
Alors la requête retourne un résultat vide.
Toute aide serait appréciée. Aussi, en passant, est-il préférable de stocker l'époque unix dates comme des entiers ou TIMESTAMP?
REMARQUE: je suis de ne pas avoir de problèmes lors de l'insertion des données, il suffit d'essayer de le récupérer à partir de la base de données. La ligne existe quand je vérifie via mysqlclient.
Merci Beaucoup!@
OriginalL'auteur Ian Livingstone | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
Un conseil: vous devriez être en mesure d'appeler
uuid.uuid4().bytes
pour obtenir le rawoctets. Comme pour l'horodatage, si vous souhaitez effectuer heure/de la date de manipulation
en SQL, il est souvent plus facile de traiter avec les TIMESTAMP.
J'ai créé une table de test pour essayer de reproduire ce que vous voyez:
Mon script est capable d'insérer et de requête pour les lignes à l'aide du champ binaire comme un
la clé sans problème. Vous êtes peut-être incorrecte de l'extraction /itération sur la
les résultats retournés par le curseur?
De sortie:
OriginalL'auteur samplebias
À compléter les réponses, il y a également un problème avec l'avertissement suivant lorsque vous traitez avec des chaînes binaires dans les requêtes:
Il est reproduit par le texte suivant:
Chaque fois que MySQL ne voit qu'une chaîne de caractères littérale dans une requête n'est pas valide à contre courant
character_set_connection
il émet l'avertissement. Il y a plusieurs solutions:Définir explicitement
_binary
jeu de caractères littéraleManuellement construire des requêtes avec hexadécimal littéraux
Changement connexion charset si vous êtes seul à travailler avec des chaînes binaires
Pour plus de détails, voir MySQL Bug 79317.
Mise à jour
@Charlax l'a souligné, il y a
binary_prefix
drapeau qui peut être transmis à la connexion de l'initialiser automatiquement ajouter_binary
préfixe lors de l'interpolation des argumetns. Il est pris en charge par les versions récentes de deux, mysql-client et pymysql.binary_prefix=True
comme une option de connexion. Voir bitbucket.org/zzzeek/sqlalchemy/issues/3804/...OriginalL'auteur saaj