it-swarm-id.com

Apakah ada cara untuk mendapatkan daftar nama kolom di sqlite?

Saya ingin mendapatkan daftar nama kolom dari tabel dalam database. Dengan menggunakan pragma saya mendapatkan daftar tuple dengan banyak informasi yang tidak dibutuhkan. Apakah ada cara untuk mendapatkan hanya nama kolom? Jadi saya mungkin berakhir dengan sesuatu seperti ini:

[Kolom1, Kolom2, Kolom3, Kolom4]

Alasan mengapa saya sangat membutuhkan daftar ini adalah karena saya ingin mencari nama kolom dalam daftar dan mendapatkan indeks karena indeks digunakan dalam banyak kode saya.

Apakah ada cara untuk mendapatkan daftar seperti ini?

Terima kasih

42
Denman

Anda dapat menggunakan sqlite3 dan pep-249

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

cursor.description adalah deskripsi kolom

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

Atau Anda bisa menggunakan pemahaman daftar:

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

Alternatif untuk solusi cursor.description dari smallredstone bisa menggunakan row.keys ():

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()

Kekurangannya: ini hanya berfungsi jika setidaknya ada satu baris yang dikembalikan dari kueri. 

Manfaatnya: Anda dapat mengakses kolom dengan namanya (baris ['nama_anda_Anda'])

Baca lebih lanjut tentang objek Row di dokumentasi python .

25
flokk

Sejauh yang saya tahu Sqlite tidak mendukung INFORMATION_SCHEMA. Sebaliknya ia memiliki sqlite_master.

Saya tidak berpikir Anda bisa mendapatkan daftar yang Anda inginkan hanya dalam satu perintah. Anda bisa mendapatkan informasi yang Anda butuhkan menggunakan sql atau pragma, kemudian gunakan regex untuk membaginya menjadi format yang Anda butuhkan

SELECT sql FROM sqlite_master WHERE name='tablename';

memberi Anda sesuatu seperti

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

Atau menggunakan pragma

PRAGMA table_info(tablename);

memberi Anda sesuatu seperti

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

Cara cepat dan interaktif untuk melihat nama kolom

Jika Anda bekerja secara interaktif dalam Python dan hanya ingin cepat 'melihat' nama kolom, saya menemukan cursor.description berfungsi.

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

Keluaran sesuatu seperti ini:

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

Atau, cara cepat untuk mengakses dan mencetaknya.

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

Keluaran sesuatu seperti ini:

Date
Object-Name
Object-Count
7
Joseph True

Dengan asumsi Anda tahu nama tabel, dan ingin nama-nama kolom data Anda dapat menggunakan kode yang tercantum akan melakukannya dengan cara yang sederhana dan elegan menurut selera saya: 

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

Saya menggunakan ini:

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

Saya suka jawabannya oleh @ thebeancounter, tetapi lebih memilih parameterisasi yang tidak diketahui, satu-satunya masalah adalah kerentanan terhadap eksploitasi pada nama tabel. Jika Anda yakin tidak apa-apa, maka ini berfungsi:

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] 

Jika ini masalah, Anda bisa menambahkan kode untuk membersihkan tablename.

1
4dummies

Anda bisa mendapatkan daftar nama kolom dengan menjalankan:

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

Anda dapat memeriksa apakah ada kolom tertentu dengan menjalankan:

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

Referensi:

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

0
user1461607