Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy-获取表格列表_Python_Mysql_Sqlalchemy_Pyramid - Fatal编程技术网

Python SQLAlchemy-获取表格列表

Python SQLAlchemy-获取表格列表,python,mysql,sqlalchemy,pyramid,Python,Mysql,Sqlalchemy,Pyramid,我在文档中找不到关于这方面的任何信息,但如何获得在SQLAlchemy中创建的表列表 我使用class方法创建了表。所有表都收集在SQLAlchemy元数据对象的tables属性中。要获取这些表的名称列表,请执行以下操作: >>> metadata.tables.keys() ['posts', 'comments', 'users'] 如果您使用的是声明性扩展,那么您可能没有亲自管理元数据。幸运的是,元数据仍然存在于基类上 >>> Base = sqlal

我在文档中找不到关于这方面的任何信息,但如何获得在SQLAlchemy中创建的表列表


我使用class方法创建了表。

所有表都收集在SQLAlchemy元数据对象的
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)

创建表时使用的元数据对象在字典中包含该对象

metadata.tables.keys()

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

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

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()
它执行execute并返回所有表

更新:

博士后:

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

一次反射所有表也可以检索隐藏的表名。我创建了一些临时表,它们显示为

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

参考

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

这对于直接处理桌子很有用,我觉得这是推荐的

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

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

“metadata.tables”提供表名和表对象的Dict。这对于快速查询也很有用。

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

就这么简单:

engine.table_names()
此外,要测试表是否存在,请执行以下操作:

engine.has\u表(表名称)

最好的方法是使用
检查

  • 创建检查器并将其连接到引擎
  • 收集数据库中表的名称
  • 收集表列名称
    • 要获取数据库中所有现有表的列表,请执行以下操作:
    从SQLAlchemy 1.4开始:

    从sqlalchemy导入创建引擎
    从sqlalchemy导入检查
    引擎=创建引擎(“…”)
    检验=检查(发动机)
    打印(检查获取表格名称()
    
    较旧的方法(
    engine.table_names()
    )产生:

    SADeprecationWarning:Inspector上的from_engine()方法已弃用,将在将来的版本中删除。请在引擎或连接上使用sqlalchemy.inspect()函数以获取检查器。(从1.4起已弃用)

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

    显示所有列信息的完整示例。假设变量
    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))
    

    自版本0.8以来已弃用:请使用sqlalchemy.schema.MetaData.reflect()方法。请注意,使用
    engine=sqlalchemy.create\u engine('mysql://user:password@主机/db_name')
    而不是
    “mysql://user:password@主机“
    引擎.execute(“使用db\U名称”)
    @XuJiawan:我不确定这里不推荐哪种方法,如果不是
    sqlalchemy.MetaData.reflect()
    ?@IfLoop:我是从中找到的。@XuJiawan:链接建议使用
    元数据的
    reflect
    参数。\uuuuu init\uuuuu
    ,一个布尔标志,不赞成使用
    元数据。reflect()
    ,正如我在回答中所示。@IfLoop:非常抱歉我的英语不好。你的答案完全正确,我把它加了上去。我添加这个评论只是为了让人们注意到,如果他们使用版本,这不是跨平台的。它只适用于mysql,不适用于其他数据库引擎。@EdwardBetts你是对的,你想知道什么数据库引擎?OP要求postgres不是sqli get
    Traceback(最近一次调用最后一次):文件“dedup_jobs.py”,第31行,在print(engine.table_names())文件中“/Users/darshanchoudhary/.virtualenvs/services/lib/python3.6/site packages/sqlalchemy/engine/base.py”,第2128行,表名返回self.dialogue.get_表名(conn,schema)value=value.replace(self.escape,self.escape)AttributeError:“非类型”对象没有属性“replace”
    (堆栈截断)这也适用于Flask SQLAlchemy,因为有via,例如,
    DB.engine.table_names()
    或任何数据库变量的名称。这是自2018年11月起生效的正确答案。如果它不起作用,则很可能是因为引擎无法正确连接(因此第2行出现问题)但是在运行
    引擎之前,您不会收到错误消息。table_names()
    使用此回答people.this!如果没有
    反射
    元数据,则排序的_tables
    将不起作用注意:这不适用于SQLAlchemy 2.0
    for table_name in engine.table_names():
        print(table_name)
    
    $ python
    >>> from myapp import db
    >>> db.engine.table_names()
    
    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"])
    
    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))