【发布时间】:2011-09-22 08:50:25
【问题描述】:
我在文档中找不到任何相关信息,但是如何获取在 SQLAlchemy 中创建的表的列表?
我使用类方法来创建表格。
【问题讨论】:
标签: python mysql sqlalchemy pyramid
我在文档中找不到任何相关信息,但是如何获取在 SQLAlchemy 中创建的表的列表?
我使用类方法来创建表格。
【问题讨论】:
标签: python mysql sqlalchemy pyramid
如果您使用的是 Flask-SQLAlchemy,您可以从您的数据库实例中获取它们
[...]
db = SQLAlchemy(app)
db.engine.table_names() # you'll get a list of all the table names in your database
【讨论】:
这是我在 2021 年 10 月 22 日使用的:
import sqlalchemy as sql
engine = sql.create_engine("connection_string")
sql.inspect(engine).get_table_names()
【讨论】:
显示所有列信息的完整示例。假设变量 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))
【讨论】:
从 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()
【讨论】:
最好的方法是使用inspect:
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"])
【讨论】:
就这么简单:
engine.table_names()
另外,测试一个表是否存在:
engine.has_table(table_name)
【讨论】:
所有表都收集在 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)
【讨论】:
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name') 而不是"mysql://user:password@host" 和engine.execute("use db_name")。
sqlalchemy.MetaData.reflect(),我不确定我建议哪种方法?
reflect argument 到MetaData.__init__ 是一个布尔标志,有利于使用@ 987654333@,正如我在回答中所展示的那样。
在 python 解释器中使用 db.engine.table_names()
$ python
>>> from myapp import db
>>> db.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()
它执行并返回所有表。
更新:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
【讨论】:
我正在解决同样的问题并找到了这篇文章。经过一些尝试运行后,我建议使用下面列出所有表:(由 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”为表名和表对象提供了一个字典。这对于快速查询也很有用。
【讨论】:
reflect,metadata.sorted_tables 将无法工作
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
【讨论】:
engine.table_names()
一次反映所有表允许您检索隐藏的表名。我创建了一些临时表,它们显示为
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
【讨论】:
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'(堆栈被截断)
DB.engine.table_names() 或任何数据库变量的名称。
您用来创建表的元数据对象在字典中。
metadata.tables.keys()
【讨论】:
metadata.reflect(bind=engine)。