我正在使用python项目,我使用Sqlite3来存储一些用户'数据
然而,我有两个问题: 首先,我不知道如何保存元组:我需要在我的Sqlite表中保存类似(' RSA',6584,786)的内容以下是代码:
def ajouter_utilisateur(identifiant, prenom, adresse_mail, mdp, cle_privee, cle_publique):
commande = sqlite3.connect ('Base_de_donnees.db')
curseur = commande.cursor()
curseur.execute ('''SELECT id FROM utilisateurs''')
id_utilises = curseur.fetchall() # crée une liste [(0,),(1,)...]
nouvel_id = 0
for id_utilise in id_utilises:
if nouvel_id <= id_utilise [0]:
nouvel_id = id_utilise [0] + 1 # le nouvel id est supérieur au plus grand id déja présent
curseur.execute ('''INSERT INTO utilisateurs VALUES (?,?,?,?,?,?,?)''', (nouvel_id, identifiant, prenom, adresse_mail, mdp, cle_privee, cle_publique))
commande.commit()
commande.close()
>>> ajouter_utilisateur ('guil','guil','mail','password',('RSA',587,78), (577,789))
File xx, line 40, in ajouter_utilisateur
curseur.execute ('''INSERT INTO utilisateurs VALUES (?,?,?,?,?,?,?)''',
(nouvel_id, identifiant, prenom, adresse_mail, mdp, cle_privee, cle_publique))
sqlite3.InterfaceError: Error binding parameter 5 - probably unsupported type.
变量是法语,对不起^^ 所以,我想要的是在数据库中保存此RSA公钥。但似乎没有Sqlite3支持。我发现了这个Python doc,但它解释了如何调整自己创建的类中的对象(或者我理解的那些) 如何调整我的元组以将其保存在表格中?然后,我该如何恢复它? (假设存储的数据不再是真正的元组)
我的第二个问题是,我创建了一个函数来获取一些数据,但是存在一个小问题:)
def recuperer_donnee_utilisateur (identifiant, donnee):
commande = sqlite3.connect ("Base_de_donnees.db")
curseur = commande.cursor()
curseur.execute ('''SELECT ? FROM utilisateurs WHERE identifiant = ?''', (donnee, identifiant))
donnee_demandee = curseur.fetchone()
commande.close()
return donnee_demandee
>>> ajouter_utilisateur ('guil23', 'guil', 'email_adress', 'password', 687,786)
>>> recuperer_donnee_utilisateur ('guil23', 'adresse_mail')
('adresse_mail',)
在这里,它应该返回&#39; email_adress&#39;,而不是我给函数的参数...为什么它返回&#39; adresse_mail&#39; ?
感谢您的帮助
编辑:
这里我删除了数据库,这样你就可以看到会发生什么。该函数名为&#34; affichage_utilisateur()&#34;只显示已保存在数据库中的用户。
>>> affichage_utilisateurs()
>>> ajouter_utilisateur ('guil23', 'guil', 'my_email_adress', 'my_password', 687,787)
>>> affichage_utilisateurs()
(0, 'guil23', 'guil', 'my_email_adress', 'my_password', '687', '787')
>>> recuperer_donnee_utilisateur ('guil23', 'mot_de_passe') # I want my password
('mot_de_passe',)
只有一个用户,他的密码是&#39; my_password&#39;所以我应该得到'my_password&#39;而不是带有&#39; mot_de_passe&#39;的元组。 &#39; mot_de_passe&#39;是用户&#39;的列的名称。密码已保存。该表以这种方式定义:
curseur.execute ('''CREATE TABLE IF NOT EXISTS utilisateurs (id INTEGER PRIMARY KEY, identifiant TEXT, prenom TEXT, adresse_mail TEXT, mot_de_passe TEXT, cle_privee TEXT, cle_publique TEXT)''')
答案 0 :(得分:1)
元组是python对象。您将无法“按原样”将它们存储在数据库中。您首先必须将它们转换为一堆二进制数据,然后可以将其映射回python对象。这称为序列化,有一种简单的方法可以在python中使用pickle。
话虽如此,在许多层面上这样做会很难看并且是一个非常糟糕的想法(跨平台编码,数据库规范,所有与一般的泡菜相关的问题,等等)。最好的方法是将你的元组分成不同的列并独立存储。
关于你的第二个问题,我没有看到任何明显的问题,你确定数据库中没有其他记录identifiant=guil32
以及谁将“adresse_mail”作为电子邮件地址?
关于你提出的第二个问题。问题是您通过sqlite3查询清理程序传递查询字段(通过使用?替换)。因此,生成的sql请求被解释为
SELECT 'adresse_email' FROM ...
而不是SELECT adresse_mail FROM ...
,它会改变每一个。
最后一件事,声明一个字段INTEGER PRIMARY KEY
就足以让它自动递增。你不需要你的体操来创造一个新的身份。
完整的代码为我工作:
# -*- coding: utf-8 -*-
import sqlite3
commande = sqlite3.connect("Base_de_donnees.db")
curseur = commande.cursor()
curseur.execute ('''CREATE TABLE IF NOT EXISTS utilisateurs (id INTEGER PRIMARY KEY,
identifiant TEXT, prenom TEXT, adresse_mail TEXT, mot_de_passe TEXT, cle_privee TEXT, cle_publique TEXT)''')
def ajouter_utilisateur(identifiant, prenom, adresse_mail, mdp, cle_privee, cle_publique):
curseur.execute ('''INSERT INTO utilisateurs(identifiant, prenom, adresse_mail,
mot_de_passe, cle_privee, cle_publique) VALUES (?,?,?,?,?,?)''', (
identifiant, prenom, adresse_mail, mdp, cle_privee, cle_publique))
commande.commit()
def recuperer_donnee_utilisateur (identifiant, donnee):
curseur.execute ('''SELECT {} FROM utilisateurs WHERE identifiant = ?'''.format(donnee), (identifiant,))
donnee_demandee = curseur.fetchone()
return donnee_demandee
ajouter_utilisateur ('guil23', 'guil', 'email_adress', 'password', 687,786)
print recuperer_donnee_utilisateur ('guil23', 'adresse_mail')
commande.close()