it-swarm.com.de

Gibt es eine Möglichkeit, eine Liste von Spaltennamen in sqlite abzurufen?

Ich möchte eine Liste von Spaltennamen aus einer Tabelle in einer Datenbank erhalten. Mit Pragma bekomme ich eine Liste von Tupeln mit vielen nicht benötigten Informationen. Gibt es eine Möglichkeit, nur die Spaltennamen zu erhalten? So könnte ich mit so etwas enden:

[Spalte1, Spalte2, Spalte3, Spalte4]

Der Grund, warum ich diese Liste unbedingt brauche, liegt darin, dass ich nach einem Spaltennamen in der Liste suchen und den Index abrufen möchte, da der Index in meinem Code verwendet wird.

Gibt es eine Möglichkeit, eine solche Liste zu erhalten?

Vielen Dank

42
Denman

Sie können sqlite3 und pep-249 verwenden.

import sqlite3
connection = sqlite3.connect('~/foo.sqlite')
cursor = connection.execute('select * from bar')

cursor-Beschreibung ist die Beschreibung der Spalten

names = list(map(lambda x: x[0], cursor.description))

Alternativ können Sie ein Listenverständnis verwenden:

names = [description[0] for description in cursor.description]
100
smallredstone

Eine Alternative zur cursor.description - Lösung von smallredstone könnte die Verwendung von row.keys () sein:

import sqlite3
connection = sqlite3.connect('~/foo.sqlite')
connection.row_factory = sqlite3.Row
cursor = connection.execute('select * from bar')
# instead of cursor.description:
row = cursor.fetchone()
names = row.keys()

Der Nachteil: Es funktioniert nur, wenn mindestens eine Zeile von der Abfrage zurückgegeben wird. 

Der Vorteil: Sie können auf die Spalten über ihren Namen zugreifen (Zeile ['Ihr_Spaltenname']).

Weitere Informationen zu den Row-Objekten finden Sie in der Python-Dokumentation .

25
flokk

Soweit ich weiß, unterstützt Sqlite INFORMATION_SCHEMA nicht. Stattdessen hat es sqlite_master.

Ich denke nicht, dass Sie die gewünschte Liste mit nur einem Befehl erhalten können. Sie können die benötigten Informationen mithilfe von SQL oder Pragma abrufen und dann mit Regex in das gewünschte Format aufteilen

SELECT sql FROM sqlite_master WHERE name='tablename';

gibt dir sowas

CREATE TABLE tablename(
        col1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        col2 NVARCHAR(100) NOT NULL,
        col3 NVARCHAR(100) NOT NULL,
)

Oder mit Pragma

PRAGMA table_info(tablename);

gibt dir sowas

0|col1|INTEGER|1||1
1|col2|NVARCHAR(100)|1||0
2|col3|NVARCHAR(100)|1||0
11
wdavo

Schnelle, interaktive Methode zum Anzeigen von Spaltennamen

Wenn Sie interaktiv in Python arbeiten und einfach nur die Spaltennamen "sehen" möchten, habe ich die Cursor-Beschreibung gefunden.

import sqlite3
conn = sqlite3.connect('test-db.db')
cursor = conn.execute('select * from mytable')
cursor.description

Gibt so etwas aus:

(('Date', None, None, None, None, None, None),
 ('Object-Name', None, None, None, None, None, None),
 ('Object-Count', None, None, None, None, None, None))

Oder eine schnelle Möglichkeit, auf sie zuzugreifen und sie auszudrucken.

colnames = cursor.description
for row in colnames:
    print row[0]

Gibt so etwas aus:

Date
Object-Name
Object-Count
7
Joseph True

Wenn Sie davon ausgehen, dass Sie den Tabellennamen kennen und die Namen der Datenspalten haben möchten, können Sie den aufgelisteten Code verwenden. Dies geschieht auf einfache und elegante Weise nach meinem Geschmack: 

import sqlite3

def get_col_names():
#this works beautifully given that you know the table name
    conn = sqlite3.connect("t.db")
    c = conn.cursor()
    c.execute("select * from tablename")
    return [member[0] for member in c.description]
5
thebeancounter

Ich benutze das:

import sqlite3

    db = sqlite3.connect('~/foo.sqlite')
    dbc = db.cursor()
    dbc.execute("PRAGMA table_info('bar')"
    ciao = dbc.fetchall()

    HeaderList=[]
    for i in ciao:
        counter=0
        for a in i:
            counter+=1
            if( counter==2):
                HeaderList.append(a)

print(HeaderList)
2

Ich mag die Antwort von @thebeancounter, möchte aber die Unbekannten parametrisieren, da das einzige Problem darin besteht, dass der Tabellenname ausgenutzt wird. Wenn Sie sicher sind, dass es in Ordnung ist, funktioniert das:

def get_col_names(cursor, tablename):
    """Get column names of a table, given its name and a cursor
       (or connection) to the database.
    """
    reader=cursor.execute("SELECT * FROM {}".format(tablename))
    return [x[0] for x in reader.description] 

Wenn es ein Problem ist, können Sie Code hinzufügen, um den Tabellennamen zu bereinigen.

1
4dummies

Es ist sehr leicht.
Erstellen Sie zuerst eine Verbindung und nennen Sie sie con. Führen Sie dann den folgenden Code aus.

get_column_names=con.execute("select * from table_name limit 1")
col_name=[i[0] for i in get_column_names.description]
print(col_name)

Sie erhalten den Spaltennamen als Liste

0
Atif

Sie können eine Liste der Spaltennamen erhalten, indem Sie Folgendes ausführen:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql

Sie können überprüfen, ob eine bestimmte Spalte vorhanden ist, indem Sie Folgendes ausführen:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1

Referenz:

https://www.sqlite.org/pragma.html#pragfunc

0
user1461607