24

データベース内のテーブルの名前を見つける方法を見つけようとしています(存在する場合)。私が使用できるsqlite cliからそれを見つけました:

>.tables

次に、フィールドについて:

>PRAGMA TABLE_INFO(table_name)

これは明らかにPython内では機能しません。Pythonでこれを行う方法はありますか、それともsqliteコマンドラインを使用するだけですか?

4

10 に答える 10

32

sqlite FAQから:

SELECTC/C++ プログラム (または Tcl/Ruby/Perl/Python バインディングを使用するスクリプト) 内から、"SQLITE_MASTER" という名前の特別なテーブルで a を実行することにより、テーブルおよびインデックス名にアクセスできます。すべての SQLite データベースには、SQLITE_MASTERデータベースのスキーマを定義するテーブルがあります。テーブルは次のSQLITE_MASTERようになります。

CREATE TABLE sqlite_master (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);

したがって、すべてのテーブル名のリストを取得するには、次を実行します。

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

特定のテーブルの列名を取得するには、次のpragma table_infoコマンドを使用します。

このプラグマは、指定されたテーブルの列ごとに 1 つの行を返します。結果セットの列には、列名、データ型、列を NULL にできるかどうか、および列のデフォルト値が含まれます。

このコマンドは、Python から問題なく動作します。

>>> import sqlite3
>>> conn = sqlite3.connect(':mem:')
>>> for row in conn.execute("pragma table_info('sqlite_master')").fetchall():
...     print row
... 
(0, u'type', u'text', 0, None, 0)
(1, u'name', u'text', 0, None, 0)
(2, u'tbl_name', u'text', 0, None, 0)
(3, u'rootpage', u'integer', 0, None, 0)
(4, u'sql', u'text', 0, None, 0)

残念ながら、pragmaステートメントはパラメーターでは機能しません。テーブル名を手動で挿入する必要があります (信頼できないソースから取得されていないことを確認し、適切にエスケープしてください)。

于 2012-08-16T22:51:01.910 に答える
27

テーブルからテーブル名にアクセスできるはずですsqlite_master

SELECT name FROM sqlite_master WHERE type='table';

列の名前には直接アクセスできません。それらを取得する最も簡単な方法は、テーブルにクエリを実行し、クエリ結果から列名を取得することです。

SELECT * FROM table_name LIMIT 1;
于 2012-08-16T22:37:15.893 に答える
9

Martijn の応答に基づいて作成した便利なプリンターを次に示します。

def printSchema(connection):
    for (tableName,) in connection.execute(
        """
        select NAME from SQLITE_MASTER where TYPE='table' order by NAME;
        """
    ):
        print("{}:".format(tableName))
        for (
            columnID, columnName, columnType,
            columnNotNull, columnDefault, columnPK,
        ) in connection.execute("pragma table_info('{}');".format(tableName)):
            print("  {id}: {name}({type}){null}{default}{pk}".format(
                id=columnID,
                name=columnName,
                type=columnType,
                null=" not null" if columnNotNull else "",
                default=" [{}]".format(columnDefault) if columnDefault else "",
                pk=" *{}".format(columnPK) if columnPK else "",
            ))
于 2016-01-29T19:45:32.880 に答える
2

フィールド名を取得するには、クエリの後に cur.description を使用します。

import sqlite3.dbapi2 as sqlite
con = sqlite.connect(":memory:")
cur = con.cursor()
con.executescript("""
    create table test (name, address);
    insert into test (name, address) values ("Jer", "Monterey Street");
""")

cur.execute("select * from test where 1=0")
rs = cur.fetchall()  ## will be [] because of where clause
field_names = [r[0] for r in cur.description]
于 2012-08-16T22:52:45.450 に答える
1

sqlite 行オブジェクトを使用します。行オブジェクトには、スキーマを提供する keys() があります。

docs.python.org から

conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('select * from stocks')
  <sqlite3.Cursor object at 0x7f4e7dd8fa80>
r = c.fetchone()
type(r)
  <type 'sqlite3.Row'>
  r
  (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
r.keys()
  ['date', 'trans', 'symbol', 'qty', 'price']
于 2013-06-09T16:33:10.790 に答える
1

やってみました

SELECT name FROM my_db.sqlite_master WHERE type='table';

トム・カーの答えと、接続されたデータベースに関する情報を取得する試みを組み合わせる。最初はうまくいきませんでした。最初に、この方法で他のデータベースをアタッチする必要があることがわかりました。

ATTACH DATABASE 'file:my_other_database_file.db?cache=shared' as my_db;

そうしないと、データベースはアタッチされたデータベースの読み取りロックを取得できませんsqlite_master(そして、すべてのクエリは成功し、結果はゼロになります)。他の誰かが問題のその部分に出くわした場合のヒントです。

于 2016-04-20T12:46:45.020 に答える
0

結果セットには、情報を取得できる説明があります。列名や列数などのいくつかの基本的なメタデータが明らかになります。

>>> rs = c.execute('''SELECT * FROM news WHERE 1=0''');
>>> dir(rs)
['__class__', '__delattr__', '__doc__', '__format__',  
'__getattribute__', '__hash__', '__init__', '__iter__', '__new__',  
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', 'arraysize', 'close', 'connection',
**'description'**, 'execute', 'executemany', 'executescript', 'fetchall',
'fetchmany', 'fetchone', 'lastrowid', 'next', 'row_factory',
'rowcount', 'setinputsizes', 'setoutputsize']



>>> print(rs.description)
(('id', None, None, None, None, None, None), 
('imageUrl', None, None, None, None, None, None), 
('headline', None, None, None, None, None, None), 
('who', None, None, None, None, None, None))
于 2016-08-06T00:33:04.930 に答える