2012-04-17 6 views
28

Gibt es eine Möglichkeit zum Abrufen des SQL-Ergebnisspaltenwerts mithilfe des Spaltennamens anstelle des Spaltenindex in Python? Ich benutze Python 3 mit mySQL. Die Syntax ich suche ist ziemlich ähnlich wie das Java-Konstrukt:Wie wird der SQL-Ergebnisspaltenwert mithilfe des Spaltennamens in Python abgerufen?

Object id = rs.get("CUSTOMER_ID"); 

ich eine Tabelle mit einer ganzen Reihe von Spalten habe, und es ist ein echten Schmerzen, ständig den Index ausrechnen für jede Spalte Ich brauche zugreifen. Außerdem macht der Index meinen Code schwer lesbar.

Danke!

+0

Sie Vielleicht möchten Sie mehr Details zur Verfügung stellen, wie zum Beispiel Code, den Sie ausprobieren, Python-Paket, das Sie verwenden. – Shekhar

Antwort

52

Das MySQLdb Modul verfügt über eine DictCursor:

verwenden sie es wie folgt (aus Writing MySQL Scripts with Python DB-API):

cursor = conn.cursor(MySQLdb.cursors.DictCursor) 
cursor.execute("SELECT name, category FROM animal") 
result_set = cursor.fetchall() 
for row in result_set: 
    print "%s, %s" % (row["name"], row["category"]) 

edit: Nach user1305650 funktioniert das auch für pymysql.

+6

Versucht dies und es funktioniert auch nicht - hat einen Fehler "TypeError: Tuple-Indizes müssen ganze Zahlen sein, nicht str" – Thomas

+2

Verwenden Sie das 'MySQLdb' Modul? Haben Sie Ihren Cursor genau so erstellt: 'cursor = conn.cursor (MySQLdb.cursors.DictCursor)'? –

+0

mein schlechtes! Ich habe den Cursor nicht wie in Ihrem Beitrag erstellt. Es funktioniert jetzt - ich muss nur MySQLdb.cursors.DictCursor zu pymysql.cursors.DictCursor ändern, weil ich pymysql verwende. Vielen Dank! – Thomas

-1

Natürlich gibt es. In Python 2.7.2 + ...

import MySQLdb as mdb 
con = mdb.connect('localhost', 'user', 'password', 'db'); 
cur = con.cursor() 
cur.execute('SELECT Foo, Bar FROM Table') 
for i in range(int(cur.numrows)): 
    foo, bar = cur.fetchone() 
    print 'foo = %s' % foo 
    print 'bar = %s' % bar 
+1

-1. Tut mir leid, bezweifle ernsthaft, dass das OP gemeint hat. –

+0

Was denkst du, was er versucht? Wählen Sie die Werte nach Spaltennamen und weisen Sie sie Variablen zu, scheint ziemlich einfach zu sein. – TaoJoannes

+0

Es sieht so aus, als wolle er eine Lösung, die unabhängig von der Spaltenreihenfolge ist. –

0

Sie bieten nicht viele Details, aber man könnte so etwas wie dies versuchen:

# conn is an ODBC connection to the DB 
dbCursor = conn.cursor() 
sql = ('select field1, field2 from table') 
dbCursor = conn.cursor() 
dbCursor.execute(sql) 
for row in dbCursor: 
    # Now you should be able to access the fields as properties of "row" 
    myVar1 = row.field1 
    myVar2 = row.field2 
conn.close() 
+0

Entschuldigung, es funktioniert nicht. Obwohl ich unsicher bin, ob es daran liegt, dass mySQL-Implementierung oder nur DB-API-2.0 fehlt. – Thomas

+0

Haben Sie versucht mit Pyodbc? Es sollte generisch sein und dieselbe Schnittstelle für jede Datenbank unterstützen. – Diego

-1

Python 2,7

import pymysql 

conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='password', db='sakila') 

cur = conn.cursor() 

n = cur.execute('select * from actor') 
c = cur.fetchall() 

for i in c: 
    print i[1] 
+0

OP will nach Attribut nicht indexieren – levi

2

Dieser Beitrag ist alt, aber über verschiedene Such kommen kann.

Jetzt können Sie mysql.connector verwenden, um ein Wörterbuch retrive wie hier gezeigt: https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

Hier ist das Beispiel auf der MySQL-Website:

cnx = mysql.connector.connect(database='world') 
cursor = cnx.cursor(dictionary=True) 
cursor.execute("SELECT * FROM country WHERE Continent = 'Europe'") 

print("Countries in Europe:") 
for row in cursor: 
    print("* {Name}".format(Name=row['Name'] 
1

Import pymysql

# Open database connection 
db = pymysql.connect("localhost","root","","gkdemo1") 

# prepare a cursor object using cursor() method 
cursor = db.cursor() 

# execute SQL query using execute() method. 
cursor.execute("SELECT * from user") 

# Get the fields name (only once!) 
field_name = [field[0] for field in cursor.description] 

# Fetch a single row using fetchone() method. 
values = cursor.fetchone() 

# create the row dictionary to be able to call row['login'] 
**row = dict(zip(field_name, values))** 

# print the dictionary 
print(row) 

# print specific field 
print(**row['login']**) 

# print all field 
for key in row: 
    print(**key," = ",row[key]**) 

# close database connection 
db.close() 
Verwandte Themen