2016-04-14 2 views
-3

Ich schreibe ein Skript, das Zeile aus DB nimmt und über die Zeilen iteriert.Wie kann ich PostgreSQL-Zeilen im Python-Skript übertragen?

In MySQL würde ich tun:

import MySQLdb 
db_mysql=MySQLdb.Connect(user=...,passwd=...,db=..., host=...) 
cur = db_mysql.cursor(MySQLdb.cursors.DictCursor) 
cur.execute ("""SELECT X,Y,Z FROM tab_a""") 
for row in crs.fetchall() : 
    do things... 

Aber ich weiß nicht, wie es in PostgreSQL zu tun. Grundsätzlich könnte diese Frage sein, wie man den obigen MySQL-Code mit PostgreSQL übersetzt.

Das ist was ich bisher habe (ich benutze PyGreSQL).

import pg 
pos = pg.connect(dbname=...,user=...,passwd=...,host=..., port=...) 
pos.query("""SELECT X,Y,Z FROM tab_a""") 

Wie wiederhole ich diese Abfrageergebnisse?

+1

Eine zwei Sekunden Suche in Google ergeben dies: http://www.pygresql.org/contents/tutorial.html –

+0

Meine schlechte Verknüpfung zu plpgsql docs, aber welche DB-API-Modul ist das? Was ich weiß [psycopg] (http://initd.org/psycopg/) zum Beispiel unterstützt Cursor schön. –

+0

Ich empfehle auch 'psycopg' zu verwenden. Was ist das überhaupt? –

Antwort

1

Von http://www.pygresql.org/contents/tutorial.html, die Sie lesen sollten.

q = db.query('select * from fruits') 
q.getresult() 

Das Ergebnis ist eine Python-Liste von Tupeln, eardh Tupel eine Zeile enthält, müssen Sie nur über die Liste iterieren und iterieren oder Index der Tupel.

+0

Kann es in ein Dikton geändert werden? Also kann ich auf Spaltennamen und nicht auf Spaltenindizes zugreifen? – java

+0

@java ändern Sie es in: q.dictrult() – Elad

0

Ich denke, es ist das gleiche, Sie Cursor erstellen müssen, rufen einige holen und iteriert wie in MySQL:

import pgdb 
pos = pgdb.connect(database=...,user=...,password=...,host=..., port=...) 
sel = "select version() as x, current_timestamp as y, current_user as z" 
cursor = db_conn().cursor() 
cursor.execute(sel) 
columns_descr = cursor.description 
rows = cursor.fetchall() 
for row in rows: 
    x, y, z = row 
    print('variables:') 
    print('%s\t%s\t%s' % (x, y, z)) 
    print('\nrow:') 
    print(row) 
    print('\ncolumns:') 
    for i in range(len(columns_descr)): 
     print('-- %s (%s) --' % (columns_descr[i][0], columns_descr[i][1])) 
     print('%s' % (row[i])) 
    # this will work with PyGreSQL >= 5.0 
    print('\n testing named tuples') 
    print('%s\t%s\t%s' % (row.x, row.y, row.z)) 
+0

es heißt 'AttributeError: Cursor' in der ersten Zeile. pos hat nicht 'cursor()' von dem, was ich sagen kann. – java

+0

OK. Sie verwenden die klassische pygres-API. Ich denke, es ist besser, seine DB API 2.0 Schnittstelle zu benutzen. Um dies zu tun, müssen Sie 'pgdb' importieren und einige Namen von Parametern in' connect() 'ändern. –

+0

Kann ich dann auf Daten wie folgt zugreifen: 'row ['x']' anstatt 'row [0]'? (Wie Dictonary). In MySQL kann ich tun: 'connection.cursor (dictionary = True)' weiß nicht, was hier gleich ist. – java

Verwandte Themen