データベースのテーブルから列名のリストを取得したい。プラグマを使用すると、多くの不要な情報を含むタプルのリストを取得できます。列名のみを取得する方法はありますか?だから私はこのようなものになるかもしれません:
[Column1、Column2、Column3、Column4]
このリストが絶対に必要な理由は、インデックスがコードの多くで使用されているため、リスト内の列名を検索してインデックスを取得するためです。
このようなリストを取得する方法はありますか?
ありがとう
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]
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ドキュメンテーション を参照してください。
私が知る限り、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
列名を表示するための迅速でインタラクティブな方法
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
テーブル名を知っていて、データ列の名前が必要だと仮定すると、リストされたコードを使用して、私の好みに合わせてシンプルでエレガントな方法でそれを行うことができます:
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]
次を実行すると、列名のリストを取得できます。
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
参照:
私はこれを使用します:
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)
私は@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]
問題がある場合は、テーブル名をサニタイズするコードを追加できます。
それは非常に簡単です。
最初に接続を作成し、名前を付けます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)
列名をリストとして取得します