2017-09-20 4 views
1

Pour le moment je n'ai pas mis INTEGER PRIMARY KEY comme je n'en ai pas besoin mais je le ferai si c'est le moyen le plus simple.Comment puis-je sélectionner la valeur d'une certaine colonne de la dernière ligne dans sqlite3 et python?

donc je configurer ma base de données et une table:

conn = sqlite3.connect('lista.db') 
c = conn.cursor() 
c.execute('CREATE TABLE IF NOT EXISTS unu(echipa1 TEXT UNIQUE, scor1 TEXT, scor2 TEXT, echipa2 TEXT, ' 
     'cota FLOAT, miza INT, stare INT)') 

i insérer des valeurs

c.execute("INSERT OR IGNORE INTO unu(echipa1,scor1, scor2, echipa2, cota, miza, stare ) VALUES (?,?,?,?,?,?,?)", 
                      (echipa1, scor1, scor2, echipa2, cota, miza, stare)) 

alors comment puis-je sélectionner la valeur pour stare de la dernière ligne?

c.execute("SELECT stare FROM unu WHERE id = Max") 

donc je sais que je n'ai pas une carte d'identité, mais ne sqlite compter les lignes, même si je ne cède pas un identifiant à chaque ligne? Sinon je tournerai un INTEGER PRIMARY KEY

c.execute('CREATE TABLE IF NOT EXISTS unu(id INTEGER PRIMARY KEY, echipa1 TEXT UNIQUE, scor1 TEXT, scor2 TEXT, echipa2 TEXT, ' 
     'cota FLOAT, miza INT, stare INT)') 

sera alors mon travail de sélection de requête?

+0

Je vous recommande d'avoir un explorateur sql tel que suite pro et d'exécuter les requêtes manuellement avant de convertir en python. –

Répondre

0

Cela dépend de votre définition de la dernière rangée. Si vous voulez sélectionner la ligne que vous venez d'insérer, vous pouvez utiliser cursor.lastrowid.

c.execute("SELECT stare FROM unu WHERE ROWID=(?)", (c.lastrowid,)) 

Si vous voulez la dernière ligne qui que ce soit inséré (quelqu'un peut avoir inséré une ligne entre l'insert et select), vous avez besoin d'un PK avec AUTOINCREMENT (juste « id INTEGER PRIMARY KEY » fera une copie du ROWID qui n'est pas garanti dans l'ordre croissant):

c.execute("SELECT stare FROM unu ORDER BY id DESC LIMIT 1") 
+0

Donc, je ne peux pas le faire sans un identifiant de ligne, merci – Rius2

+0

Je suppose que dans Sqlite vous pouvez vous en passer sans une clé primaire si vous remplacez «id» par «ROWID» (non testé). Mais une clé primaire de remplacement ne fait pas de mal et rend le code plus portable et plus explicite. –

+0

La deuxième partie n'est pas vraie/garantie car sauf si vous utilisez AUTOINCREMENT lors de la déclaration de la clé primaire SQLite ne garantit pas que ROWID/la clé primaire utilise des valeurs strictement croissantes mais peut également remplir des trous de lignes supprimées. Le ROWID de la dernière ligne insérée ne doit donc pas être le plus grand dans la table. – BlackJack

0

Vous n'avez pas besoin juste de déclarer la colonne INTEGER PRIMARY KEY, mais faire aussi AUTOINCREMENT pour garantir vraiment la dernière ligne insérée a également le plus grand ROWID/valeur de clé primaire. Sinon, SQLite peut remplir les «trous» laissés par les lignes supprimées ou les transactions échouées/annulées.