2017-03-25 5 views
0

私はPythonプロジェクトを利用しています.Sqlite3を使用してユーザーのデータを保存しています。Sqlite3に関する質問:タプルを保存してデータを取得する

私は2つの問題を持っているが:私は

がここにあります私の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を見つけましたが、自分で作成したクラス(またはそれは私が理解したもの)からオブジェクトを適合させる方法について説明します タプルをテーブルに保存するにはどうすればできますか?そして、それを回復するにはどうすればいいですか?

(データが格納されていると仮定すると、もはや本当にタプルではありません)そして、私の2番目の質問は、私はいくつかのデータを取り戻すための関数を作成し、ですが、小さな問題:)

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',) 

がここであり、それは私が関数に与えたパラメータではなく、 'email_adress'を返すことになっていた...なぜそれが 'adresse_mail'を返すのだろうか?任意のヘルプ

EDITため

ありがとう:あなたは何が起こるかを見ることができるようにここで

私は、データベースを削除しました。関数 "affichage_utilisateur()"は、データベースにすでに保存されているユーザーを表示するだけです。

>>> 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',) 

一つだけのユーザーがあるが、自分のパスワードはので、私は「my_passwordという」の代わりの「mot_de_passe」とのタプルを取得する必要があります「my_passwordという」です。 'mot_de_passe'は、ユーザーのパスワードが保存される列の名前です。テーブルは次のように定義されます。

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)''') 

答えて

1

タプルはPythonオブジェクトです。データベースに「そのまま」保管することはできません。最初にバイナリデータの束に変換しなければなりません。バイナリデータは、Pythonオブジェクトにマップすることができます。これはシリアライゼーションと呼ばれ、Pythonでpickleを使って簡単に行うことができます。

言われているように、そうするには多かれ少なかれ醜いです(クロスプラットフォームのコード化、データベースのノルム、一般的なピクルスに対するすべての問題点など)。タプルを異なる列に分割して独立して格納するのが最適です。

あなたの2番目の質問には、全く問題はありません。identifiant=guil32などのデータベースには別のレコードがなく、誰がメールアドレスとして「adresse_mail」を持っているのでしょうか?

あなたが提起した2番目の問題について問題は、クエリフィールドをsqlite3 query sanitizer(?置換を使用して)に渡すことです。したがって、結果のSQL要求はSELECT adresse_mail FROM ...の代わりに SELECT 'adresse_email' FROM ...と解釈されます。

最後に、INTEGER PRIMARY KEYというフィールドを宣言すると、自動的に増分されます。あなたは新しいIDを作成するために体操をする必要はありません。

私のために働いフルコード:

# -*- 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() 
+0

ファイン、私はタプルを分割するthouhtがあったが、それは後で、コードが複雑になりますように私が第二のものについては、別の解決策 – Guil23

+0

があったかどうかを確認したかった、I質問を編集しました – Guil23

+0

なぜそれが機能していないのでしょうか? : – Guil23

関連する問題