2017-08-29 3 views
0

Lorsque je fais une requête "SELECT" sur mon SQLite3 db, je trouve qu'il est assez compliqué de faire quelque chose d'aussi simple que d'atteindre la base de données et d'en saisir une valeur exactement comme dans mon programme. db. Je ne suis pas assez familier pour savoir si c'est comme ça ou s'il y a une meilleure façon de faire ce genre de choses.Existe-t-il une meilleure façon de travailler avec SQLite3 "SELECT" résultats de la requête dans Python3?

Le premier élément de c'est en ce qui concerne le fait que quelque chose comme ceci:

player_name = c.execute("""SELECT name FROM players WHERE pid = ?""", (pid,)) 
print(player_name) 

donnera quelque chose comme ceci:

<sqlite3.Cursor object at 0x10c185110> 

La seule façon que j'ai trouvé pour extraire le le contenu réel est en itérant sur le curseur résultant et en stockant le contenu dans une liste:

player_name = [] 
sql = c.execute("""SELECT name FROM players WHERE pid = ?""", (pid,)) 
for result in sql: 
    player_name.append(result) 
    player_name = str(player_name).replace("[", "").replace("]", "") 

L'autre élément est moins problématique mais je me suis dit que je le lancerais là-bas. Il est le fait que chaque résultat de mon exemple ci-dessus, vous obteniez comme ceci:

>>> print(player_name) 
('Ben Johnson',) 

En fin de compte, pour obtenir la chaîne exacte de la db et dans mon programme, je le fais pour chaque requête:

>>> player_name = [] 
>>> sql = c.execute("""SELECT name FROM players WHERE pid = ?""", (pid,)) 
>>> for result in sql: 
>>>  player_name.append(result) 
>>>  player_name = str(player_name).replace("[", "").replace("]", "") 
>>>  player_name = str(player_name).replace("('", "").replace("',)", "") 
>>> 
>>> print(player_name) 

Ben Johnson 

Répondre

0

L'objet curseur renvoyé par execute contient une liste de lignes (en fait, elles sont calculées à la demande); vous êtes en effet censé parcourir le curseur avec for ou quelque chose comme ça.

Chaque ligne est un tuple qui contient toutes les valeurs de colonne. Pour obtenir la première colonne, il suffit de faire row[0]:

for row in c.execute("SELECT SomeColumn FROM ..."): 
    print(row[0]) 

Si vous souhaitez obtenir une valeur de colonne d'une seule ligne, vous pouvez écrire une fonction d'assistance:

def query_single_value(db, query, *parameters): 
    cursor = db.execute(query, parameters) 
    for row in cursor: 
     return row[0] 
    else: 
     return None # not found 

print(query_single_value(c, "SELECT name FROM players WHERE pid = ?", pid))