web-dev-qa-db-ja.com

sqliteで列名のリストを取得する方法はありますか?

データベースのテーブルから列名のリストを取得したい。プラグマを使用すると、多くの不要な情報を含むタプルのリストを取得できます。列名のみを取得する方法はありますか?だから私はこのようなものになるかもしれません:

[Column1、Column2、Column3、Column4]

このリストが絶対に必要な理由は、インデックスがコードの多くで使用されているため、リスト内の列名を検索してインデックスを取得するためです。

このようなリストを取得する方法はありますか?

ありがとう

43
Denman

Sqlite3と pep-249 を使用できます

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

cursor.description 列の説明です

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

または、リストの内包表記を使用できます。

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

cursor.descriptionの代わりの smallredstone のソリューションは、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()

欠点:クエリから少なくとも1つの行が返された場合にのみ機能します。

利点:名前(row ['your_column_name'])で列にアクセスできます

Rowオブジェクトの詳細については、pythonドキュメンテーション を参照してください。

26
flokk

私が知る限り、SqliteはINFORMATION_SCHEMAをサポートしていません。代わりに、sqlite_masterがあります。

必要なリストを1つのコマンドで取得できるとは思わない。 sqlまたはプラグマを使用して必要な情報を取得し、正規表現を使用して必要な形式に分割できます。

SELECT sql FROM sqlite_master WHERE name='tablename';

あなたに何かを与えます

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

またはプラグマを使用して

PRAGMA table_info(tablename);

あなたに何かを与えます

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

列名を表示するための迅速でインタラクティブな方法

Python)でインタラクティブに作業していて、列名をすばやく「見たい」場合、cursor.descriptionが機能することがわかりました。

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

次のようなものを出力します:

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

または、それらにアクセスして印刷する簡単な方法。

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

次のようなものを出力します:

Date
Object-Name
Object-Count
7
Joseph True

テーブル名を知っていて、データ列の名前が必要だと仮定すると、リストされたコードを使用して、私の好みに合わせてシンプルでエレガントな方法でそれを行うことができます:

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

次を実行すると、列名のリストを取得できます。

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

次を実行することにより、特定の列が存在するかどうかを確認できます。

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

参照:

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

2
user1461607

私はこれを使用します:

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

私は@thebeancounterの回答が好きですが、未知のものをパラメーター化することを好みます。唯一の問題はテーブル名の悪用に対する脆弱性です。大丈夫だと確信しているなら、これはうまくいきます:

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] 

問題がある場合は、テーブル名をサニタイズするコードを追加できます。

1
4dummies

それは非常に簡単です。
最初に接続を作成し、名前を付けますcon。次に、次のコードを実行します。

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)

列名をリストとして取得します

0
Atif