代码之家  ›  专栏  ›  技术社区  ›  barciewicz

从外部脚本列出Django数据库表名

  •  0
  • barciewicz  · 技术社区  · 6 年前

    我正在尝试从外部脚本(不是项目的一部分)中访问Django项目中的sqlite3数据库。

    但是,以下将返回空列表:

    con = sqlite3.connect('database.db')
    cursor = con.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    print(cursor.fetchall())
    

    尽管我已经将一些模型保存到数据库中了。 为了检查表名,我在Django Shell中使用以下内容:

    >>> tables = connection.introspection.table_names()
    >>> seen_models = connection.introspection.installed_models(tables)
    >>> seen_models
    {<class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.sessions.models.Session'>, <class 'django.contrib.contenttypes.models.ContentType'>, <class 'explorer_api.models.Athlete'>, <class 'django.contrib.admin.models.LogEntry'>, <class 'django.contrib.auth.models.Group'>, <class 'explorer_api.models.Activity'>, <class 'django.contrib.auth.models.User'>}
    >>> tables
    ['auth_group', 'auth_group_permissions', 'auth_permission', 'auth_user', 'auth_user_groups', 'auth_user_user_permissions', 'django_admin_log', 'django_content_type', 'django_migrations', 'django_session', 'explorer_api_activity', 'explorer_api_athlete']
    

    我没有在模型的meta中显式地指定表名,所以我想表名是 appname_modelname ( explorer_api_activity explorer_api_athlete )

    但为什么是空名单呢?

    1 回复  |  直到 6 年前
        1
  •  0
  •   ruddra    6 年前

    从对这个问题的评论: 是的,只要文件的路径有效,就可以运行此脚本。我用如下小改动改写了您的脚本:

    import sqlite3
    import os.path
    
    try:
        file_name = raw_input("Enter File Path? ")
    except:
        file_name = input("Enter File Path? ")
    if os.path.isfile(file_name):
        con = sqlite3.connect(file_name)
        cursor = con.cursor()
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
        print(cursor.fetchall())
    else:
        print("File does not exist")
    

    用法:

    > python sqlite_tables.py
      (prompt)> Enter File Path? random/file/path
      (prompt)> File does not exist
    
    > python sqlite_tables.py
      (prompt)> Enter File Path? /valid/path/to/database.db
      (prompt)> [(u'django_migrations',), (u'sqlite_sequence',)...]
    
    > python sqlite_tables.py
      (prompt)> Enter File Path? ../database.db  # relative path
      (prompt)> [(u'django_migrations',), (u'sqlite_sequence',)...]