Is there a way to get a schema of a database from within python?

前端 未结 10 1926
走了就别回头了
走了就别回头了 2020-12-09 16:06

I\'m trying to find out a way to find the names of tables in a database(if any exist). I find that from a sqlite cli I can use:

>.tables
<
相关标签:
10条回答
  • 2020-12-09 17:06

    Assuming the name of the database is my_db and the name of the table is my_table, to get the name of the columns and the datatypes:

    con = sqlite.connect(my_db)
    cur = con.cursor()
    query =  "pragma table_info({})".format(my_table)
    table_info = cur.execute(query).fetchall()
    

    It returns a list of tuples. Each tuple has the order, name of the column and data type.

    0 讨论(0)
  • 2020-12-09 17:08

    From the sqlite FAQ:

    From within a C/C++ program (or a script using Tcl/Ruby/Perl/Python bindings) you can get access to table and index names by doing a SELECT on a special table named "SQLITE_MASTER". Every SQLite database has an SQLITE_MASTER table that defines the schema for the database. The SQLITE_MASTER table looks like this:

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

    So to get a list of all table names execute:

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

    To get column names for a given table, use the pragma table_info command:

    This pragma returns one row for each column in the named table. Columns in the result set include the column name, data type, whether or not the column can be NULL, and the default value for the column.

    This command works just fine from 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)
    

    Unfortunately pragma statements do not work with parameters; you'll have to manually insert the table name (make sure it's not sourced from an untrusted source and escape it properly).

    0 讨论(0)
  • 2020-12-09 17:08

    To get the field names, use cur.description after the query:

    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]
    
    0 讨论(0)
  • 2020-12-09 17:08

    make the connection to the database

    connection = connect_db('./database_name.db')
    

    print the table names

    table_names = [t[0] for t in connection.execute("SELECT name FROM sqlite_master WHERE type='table';")]
    print(table_names)
    
    0 讨论(0)
提交回复
热议问题