J'ai la méthode suivante pour sélectionner tous les identifiants de la table, les ajouter à une liste et les retourner. Mais lorsque j'exécute ce code, je finis par obtenir des indices Tuple qui doivent être des entiers ... erreur. J'ai joint l'erreur et l'impression avec ma méthode:
def questionIds(con):
print 'getting all the question ids'
cur = con.cursor()
qIds = []
getQuestionId = "SELECT question_id from questions_new"
try:
cur.execute(getQuestionId)
for row in cur.fetchall():
print 'printing row'
print row
qIds.append(str(row['question_id']))
except Exception, e:
traceback.print_exc()
return qIds
Imprimer ce que ma méthode fait:
Database version : 5.5.10
getting all the question ids
printing row
(u'20090225230048AAnhStI',)
Traceback (most recent call last):
File "YahooAnswerScraper.py", line 76, in questionIds
qIds.append(str(row['question_id'][0]))
TypeError: Tuple indices must be integers, not str
La bibliothèque standard mysql python retourne des nuplets de cursor.execute Pour obtenir le champ question_id, vous utiliseriez row[0]
, pas row['question_id']
. Les champs apparaissent dans le même ordre qu'ils apparaissent dans l'instruction select.
Une manière décente d’extraire plusieurs champs est quelque chose comme:
for row in cursor.execute("select question_id, foo, bar from questions"):
question_id, foo, bar = row
Il existe plusieurs types de curseur dans le module MySQLdb. Le curseur par défaut renvoie les données dans un tuple de tuples. Lorsque nous utilisons un curseur de dictionnaire, les données sont envoyées sous forme de dictionnaires Python. De cette façon, nous pouvons faire référence aux données par leurs noms de colonnes. La source
#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')
with con:
cur = con.cursor(mdb.cursors.DictCursor)
cur.execute("SELECT * FROM Writers LIMIT 4")
rows = cur.fetchall()
for row in rows:
print row["Id"], row["Name"]
Je sais que la question est ancienne, mais j’ai trouvé une autre façon de le faire que je pense meilleure que la solution acceptée. Je vais donc le laisser ici au cas où quelqu'un en aurait besoin.
Lors de la création du curseur, vous pouvez utiliser
cur = connection.cursor(dictionary=True);
ce qui vous permettra de faire exactement ce que vous voulez sans aucune modification supplémentaire.
rows = cur.fetchall()
for row in rows:
print "%s %s %s" % (row["Id"], row["Name"], row["Price"])
Pour récupérer des données de la base de données, utilisez le curseur du dictionnaire.
import psycopg2
import psycopg2.extras
con = psycopg2.connect(database="test", user="test", password="test", Host="localhost", port="5432")
if con != None:
print "Connection Established..!\n"
else:
print "Database Connection Failed..!\n"
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("SELECT * FROM emp")
rows = cur.fetchall()
for row in rows:
print "%s %s %s" % (row["id"],row["name"],row["address"])
print "\nRecords Display Successfully"
con.commit()
con.close()
vous pouvez voir ici: entrez la description du lien ici , je pense que vous le souhaitez
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
con = lite.connect('test.db')
with con:
con.row_factory = lite.Row # its key
cur = con.cursor()
cur.execute("SELECT * FROM Cars")
rows = cur.fetchall()
for row in rows:
print "%s %s %s" % (row["Id"], row["Name"], row["Price"])
Les index entiers ne sont pas autorisés. Pour que cela fonctionne, vous pouvez déclarer le DICT comme spécifié ci-dessous:
VarName = {}
J'espère que cela fonctionne pour toi.
row
est un tuple. Lorsque vous faites row['question_id']
, vous essayez d'accéder à un tuple à l'aide d'un index de chaîne qui vous donne une erreur.