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