Bir psycopg2 imlecinden sütun adlarının bir listesini nasıl alabilirim?


139

Doğrudan seçilen sütun adlarından sütun etiketleri oluşturmanın genel bir yolunu istiyorum ve python'un psycopg2 modülünün bu özelliği desteklediğini hatırlamak istiyorum.

Yanıtlar:


226

Mark Lutz'un "Programming Python" dan:

curs.execute("Select * FROM people LIMIT 0")
colnames = [desc[0] for desc in curs.description]

64
Yalnızca sütun adlarını istiyorsanız, tablodaki tüm satırları seçmeyin. Bu daha verimli:curs.execute("SELECT * FROM people LIMIT 0")
Demitri

2
Bunun tablolar için olduğu kadar görünümler için de işe yaradığını eklemeye değer olabilir, oysa görünümler için sütun adlarını almak (kolayca) mümkün değildir information_schema.
wjv

6
Adı bir öznitelik olarak almak daha sezgisel olabilir: colnames = [desc for desc in curs.description]
rovyko

İmleç açıklama işlevinden okunan sütun adlarının küçük harfle çıktığına dikkat etmek önemlidir. curs.execute("Select userId FROM people") colnames = [desc[0] for desc in curs.description] assert colnames == ['userid']
dyltini

Cevabınızı LIMIT 0 öneri ile güncellemelisiniz. Aksi takdirde sadece isimleri kontrol etmek için tüm tabloyu alacaksınız.
Carlos Pinzón

42

Yapabileceğiniz başka bir şey, sütunlarınıza isimleriyle başvurabileceğiniz bir imleç oluşturmaktır (bu, beni ilk etapta bu sayfaya yönlendiren bir ihtiyaç):

import psycopg2
from psycopg2.extras import RealDictCursor

ps_conn = psycopg2.connect(...)
ps_cursor = psql_conn.cursor(cursor_factory=RealDictCursor)

ps_cursor.execute('select 1 as col_a, 2 as col_b')
my_record = ps_cursor.fetchone()
print (my_record['col_a'],my_record['col_b'])

>> 1, 2

26

İçin ayrı bir sorguda sütun adlarını almak , sen INFORMATION_SCHEMA.COLUMNS tablosunu sorgulayabilir.

#!/usr/bin/env python3

import psycopg2

if __name__ == '__main__':
  DSN = 'host=YOUR_DATABASE_HOST port=YOUR_DATABASE_PORT dbname=YOUR_DATABASE_NAME user=YOUR_DATABASE_USER'

  column_names = []

  with psycopg2.connect(DSN) as connection:
      with connection.cursor() as cursor:
          cursor.execute("select column_name from information_schema.columns where table_schema = 'YOUR_SCHEMA_NAME' and table_name='YOUR_TABLE_NAME'")
          column_names = [row[0] for row in cursor]

  print("Column names: {}\n".format(column_names))

Veri satırlarıyla aynı sorguda sütun adlarını almak için , imlecin açıklama alanını kullanabilirsiniz:

#!/usr/bin/env python3

import psycopg2

if __name__ == '__main__':
  DSN = 'host=YOUR_DATABASE_HOST port=YOUR_DATABASE_PORT dbname=YOUR_DATABASE_NAME user=YOUR_DATABASE_USER'

  column_names = []
  data_rows = []

  with psycopg2.connect(DSN) as connection:
    with connection.cursor() as cursor:
      cursor.execute("select field1, field2, fieldn from table1")
      column_names = [desc[0] for desc in cursor.description]
      for row in cursor:
        data_rows.append(row)

  print("Column names: {}\n".format(column_names))

17

Db sorgusundan adlandırılmış bir tuple nesnesine sahip olmak istiyorsanız, aşağıdaki parçacığı kullanabilirsiniz:

from collections import namedtuple

def create_record(obj, fields):
    ''' given obj from db returns named tuple with fields mapped to values '''
    Record = namedtuple("Record", fields)
    mappings = dict(zip(fields, obj))
    return Record(**mappings)

cur.execute("Select * FROM people")
colnames = [desc[0] for desc in cur.description]
rows = cur.fetchall()
cur.close()
result = []
for row in rows:
    result.append(create_record(row, colnames))

Bu, kayıt değerlerine sanki sınıf özellikleriymiş gibi erişmenizi sağlar, yani

record.id, record.other_table_column_name vb.

hatta daha kısa

from psycopg2.extras import NamedTupleCursor
with cursor(cursor_factory=NamedTupleCursor) as cur:
   cur.execute("Select * ...")
   return cur.fetchall()

4

SQL sorgusunu çalıştırdıktan sonra 2.7'de yazılmış python betiğini takip edin

total_fields = len(cursor.description)    
fields_names = [i[0] for i in cursor.description   
    Print fields_names


0

Ben de benzer bir sorunla karşılaşıyordum. Bunu çözmek için basit bir numara kullanıyorum. Şöyle bir listede sütun adlarınız olduğunu varsayalım

col_name = ['a', 'b', 'c']

O zaman aşağıdakileri yapabilirsiniz

for row in cursor.fetchone():
    print zip(col_name, row)

0
 # You can use this function
 def getColumns(cursorDescription):
     columnList = []
     for tupla in cursorDescription:
         columnList.append(tupla[0])
     return columnList 

-7
#!/usr/bin/python
import psycopg2
#note that we have to import the Psycopg2 extras library!
import psycopg2.extras
import sys

def main():
    conn_string = "host='localhost' dbname='my_database' user='postgres' password='secret'"
    # print the connection string we will use to connect
    print "Connecting to database\n ->%s" % (conn_string)

    # get a connection, if a connect cannot be made an exception will be raised here
    conn = psycopg2.connect(conn_string)

    # conn.cursor will return a cursor object, you can use this query to perform queries
    # note that in this example we pass a cursor_factory argument that will
    # dictionary cursor so COLUMNS will be returned as a dictionary so we
    # can access columns by their name instead of index.
    cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

    # tell postgres to use more work memory
    work_mem = 2048

    # by passing a tuple as the 2nd argument to the execution function our
    # %s string variable will get replaced with the order of variables in
    # the list. In this case there is only 1 variable.
    # Note that in python you specify a tuple with one item in it by placing
    # a comma after the first variable and surrounding it in parentheses.
    cursor.execute('SET work_mem TO %s', (work_mem,))

    # Then we get the work memory we just set -> we know we only want the
    # first ROW so we call fetchone.
    # then we use bracket access to get the FIRST value.
    # Note that even though we've returned the columns by name we can still
    # access columns by numeric index as well - which is really nice.
    cursor.execute('SHOW work_mem')

    # Call fetchone - which will fetch the first row returned from the
    # database.
    memory = cursor.fetchone()

    # access the column by numeric index:
    # even though we enabled columns by name I'm showing you this to
    # show that you can still access columns by index and iterate over them.
    print "Value: ", memory[0]

    # print the entire row 
    print "Row: ", memory

if __name__ == "__main__":
    main()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.