【问题标题】:SQLAlchemy - Getting a list of tablesSQLAlchemy - 获取表列表
【发布时间】:2011-09-22 08:50:25
【问题描述】:

我在文档中找不到任何相关信息,但是如何获取在 SQLAlchemy 中创建的表的列表?

我使用类方法来创建表格。

【问题讨论】:

    标签: python mysql sqlalchemy pyramid


    【解决方案1】:

    如果您使用的是 Flask-SQLAlchemy,您可以从您的数据库实例中获取它们

    [...]
    db = SQLAlchemy(app)
    db.engine.table_names() # you'll get a list of all the table names in your database
    

    【讨论】:

      【解决方案2】:

      这是我在 2021 年 10 月 22 日使用的:

      import sqlalchemy as sql
      
      engine = sql.create_engine("connection_string")
      
      sql.inspect(engine).get_table_names()
      

      【讨论】:

        【解决方案3】:

        显示所有列信息的完整示例。假设变量 df 包含要写入 SQL 数据库的数据帧。

        from sqlalchemy import create_engine, inspect
        from sqlalchemy_utils.functions import database_exists, create_database
        
        engine = create_engine('sqlite:///mydb.sqlite', echo=True)
        
        if not database_exists(engine.url):
            create_database(engine.url)
        else:
            engine.connect()
        
        df.to_sql('MyTable', con=engine, if_exists='replace', index=False) # index=False avoids auto-creation of level_0 (name tiebreaker)
        
        inspector = inspect(engine)
        table_names = inspector.get_table_names()
        for table_name in table_names:
            print(f"Table:{table_name}")
            column_items = inspector.get_columns(table_name)
            print('\t'.join(n for n in column_items[0]))
            for c in column_items:
                assert len(c) == len(column_items[0])
                print('\t'.join(str(c[n]) for n in c))
        

        【讨论】:

          【解决方案4】:
          • 要获取数据库中所有现有表的列表:

          从 SQLAlchemy 1.4 开始:https://docs.sqlalchemy.org/en/14/core/reflection.html#fine-grained-reflection-with-inspector

          from sqlalchemy import create_engine
          from sqlalchemy import inspect
          engine = create_engine('...')
          insp = inspect(engine)
          print(insp.get_table_names())
          

          旧方法 (engine.table_names()) 产量:

          SADeprecationWarning: The from_engine() method on Inspector is deprecated and will be removed in a future release. Please use the sqlalchemy.inspect() function on an Engine or Connection in order to acquire an Inspector. (deprecated since: 1.4)

          • 要获取已声明表的列表,请使用接受的答案:metadata.tables.keys()

          【讨论】:

            【解决方案5】:

            最好的方法是使用inspect

            1. 创建检查器并将其连接到引擎
            2. 收集数据库中的表名
            3. 收集表列名称
            from sqlalchemy import create_engine, inspect
            
            engine = create_engine("sqlite:///../Resources/dow.sqlite")
            conn = engine.connect()
            inspector = inspect(conn)
            inspector.get_table_names() #returns "dow"
            
            columns = inspector.get_columns('dow')
            
            for column in columns:
                print(column["name"], column["type"])
            

            【讨论】:

              【解决方案6】:

              就这么简单:

              engine.table_names()
              

              另外,测试一个表是否存在:

              engine.has_table(table_name)
              

              【讨论】:

                【解决方案7】:

                所有表都收集在 SQLAlchemy MetaData 对象的tables 属性中。要获取这些表的名称列表:

                >>> metadata.tables.keys()
                ['posts', 'comments', 'users']
                

                如果您使用的是声明式扩展,那么您可能没有自己管理元数据。幸运的是,元数据仍然存在于基类中,

                >>> Base = sqlalchemy.ext.declarative.declarative_base()
                >>> Base.metadata
                MetaData(None)
                

                如果你想弄清楚你的数据库中存在哪些表,即使是那些你还没有告诉 SQLAlchemy 的表,那么你可以使用表反射。然后 SQLAlchemy 将检查数据库并使用所有缺失的表更新元数据。

                >>> metadata.reflect(engine)
                

                对于 Postgres,如果您有多个架构,则需要遍历引擎中的所有架构:

                from sqlalchemy import inspect
                inspector = inspect(engine)
                schemas = inspector.get_schema_names()
                
                for schema in schemas:
                    print("schema: %s" % schema)
                    for table_name in inspector.get_table_names(schema=schema):
                        for column in inspector.get_columns(table_name, schema=schema):
                            print("Column: %s" % column)
                

                【讨论】:

                • 自 0.8 版起已弃用:请使用 sqlalchemy.schema.MetaData.reflect() 方法。请注意,使用engine = sqlalchemy.create_engine('mysql://user:password@host/db_name') 而不是"mysql://user:password@host"engine.execute("use db_name")
                • @XuJiawan:我不确定这里不推荐使用哪种方法,如果不是sqlalchemy.MetaData.reflect(),我不确定我建议哪种方法?
                • @IfLoop:我是从the sqlalchemy document找到的。
                • @XuJiawan:该链接表明reflect argumentMetaData.__init__ 是一个布尔标志,有利于使用@ 987654333@,正如我在回答中所展示的那样。
                • @IfLoop:非常抱歉我的英语很差。你的答案是完全正确的,我已经提高了它。我添加该评论只是为了让人们注意到如果他们使用版本MetaData.reflect() 方法。并为其他可能因引擎声明而遇到相同问题的人发表评论。
                【解决方案8】:

                在 python 解释器中使用 db.engine.table_names()

                $ python
                >>> from myapp import db
                >>> db.engine.table_names()
                

                【讨论】:

                • 注意:这不适用于 SQLAlchemy 2.0
                • 正如詹姆斯所说,您必须切换到 Inspector,按照文档 ``` from sqlalchemy import create_engine engine = create_engine(self.__connection_string) insp = inspect(engine) return insp.get_table_names() `` `
                【解决方案9】:

                我一直在寻找这样的东西:

                from sqlalchemy import create_engine
                eng = create_engine('mysql+pymysql://root:password@localhost:3306', pool_recycle=3600)
                q = eng.execute('SHOW TABLES')
                
                available_tables = q.fetchall()
                

                它执行并返回所有表。

                更新:

                Postgres:

                eng = create_engine('postgresql+psycopg2://root:password@localhost/
                q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
                

                【讨论】:

                • 这不是跨平台的。它只适用于mysql,不适用于其他数据库引擎。
                • @EdwardBetts 你是对的,你想知道什么数据库引擎?
                • OP 要求 postgres 而不是 sql
                【解决方案10】:

                我正在解决同样的问题并找到了这篇文章。经过一些尝试运行后,我建议使用下面列出所有表:(由 zerocog 提到)

                metadata = MetaData()
                metadata.reflect(bind=engine)
                for table in metadata.sorted_tables:
                    print(table)
                

                这对于直接处理表格很有用,我觉得值得推荐。

                并使用以下代码获取表名:

                for table_name in engine.table_names():
                    print(table_name)
                

                “metadata.tables”为表名和表对象提供了一个字典。这对于快速查询也很有用。

                【讨论】:

                • 这个!没有reflectmetadata.sorted_tables 将无法工作
                【解决方案11】:
                from sqlalchemy import create_engine
                engine = create_engine('postgresql://use:pass@localhost/DBname')
                print (engine.table_names())
                

                【讨论】:

                • 这是截至 2018 年 11 月有效的正确答案。
                • 如果它不起作用,那么很可能是因为引擎无法正确连接(所以第 2 行有问题),但在运行 engine.table_names()
                • 使用这个答案的人。
                • 不推荐使用,您必须使用 ``` from sqlalchemy import create_engine engine = create_engine(self.__connection_string) insp = inspect(engine) return insp.get_table_names() ```
                【解决方案12】:

                一次反映所有表允许您检索隐藏的表名。我创建了一些临时表,它们显示为

                meta = MetaData()
                meta.reflect(bind=myengine)
                for table in reversed(meta.sorted_tables):
                    print table
                

                参考http://docs.sqlalchemy.org/en/latest/core/reflection.html

                【讨论】:

                  【解决方案13】:

                  engine 对象中有一个获取表名列表的方法。 engine.table_names()

                  【讨论】:

                  • 我得到Traceback (most recent call last): File "dedup_jobs.py", line 31, in <module> print(engine.table_names()) File "/Users/darshanchoudhary/.virtualenvs/services/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2128, in table_names return self.dialect.get_table_names(conn, schema) value = value.replace(self.escape_quote, self.escape_to_quote) AttributeError: 'NoneType' object has no attribute 'replace'(堆栈被截断)
                  • 这也适用于 Flask-SQLAlchemy,因为通过例如 direct access to the engine DB.engine.table_names() 或任何数据库变量的名称。
                  • 这已被弃用,您现在必须使用 ``` from sqlalchemy import create_engine engine = create_engine(self.__connection_string) insp = inspect(engine) return insp.get_table_names() ```
                  【解决方案14】:

                  您用来创建表的元数据对象在字典中。

                  metadata.tables.keys()
                  

                  【讨论】:

                  • 确保在此之前执行metadata.reflect(bind=engine)
                  猜你喜欢
                  • 2018-01-25
                  • 2014-09-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-09-09
                  • 1970-01-01
                  • 2022-01-25
                  • 2018-11-23
                  相关资源
                  最近更新 更多