web-dev-qa-db-fra.com

Python: les index de tuple doivent être des entiers et non des str lors de la sélection dans la table mysql

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
19
Null-Hypothesis

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
24
jjm

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"]
8
Rafa

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"])
5
BrunoB

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()
2
Vishal Gediya

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"])
2
BollMose

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.

0
Lanaru