drg*_*xfs 41 python database sqlalchemy
我想实现一个函数,它提供有关数据库中存在的所有表(及其列名)的信息(不仅仅是使用SQLAlchemy创建的表).在阅读文档时,在我看来,这是通过反射完成的,但我没有设法使某些工作正常.有关如何执行此操作的任何建议或示例?
zzz*_*eek 76
从引擎开始:
from sqlalchemy import create_engine
engine = create_engine("postgresql://u:p@host/database")
Run Code Online (Sandbox Code Playgroud)
所有表/列名称的快速路径,使用检查器:
from sqlalchemy import inspect
inspector = inspect(engine)
for table_name in inspector.get_table_names():
for column in inspector.get_columns(table_name):
print("Column: %s" % column['name'])
Run Code Online (Sandbox Code Playgroud)
docs:http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html? highlight= inspector# fine-grained-reflection-with- inspector
或者,使用MetaData/Tables:
from sqlalchemy import MetaData
m = MetaData()
m.reflect(engine)
for table in m.tables.values():
print(table.name)
for column in table.c:
print(column.name)
Run Code Online (Sandbox Code Playgroud)
文档:http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html#reflecting-all-tables-at-once
首先设置 sqlalchemy 引擎。
from sqlalchemy import create_engine, inspect, text
from sqlalchemy.engine import url
connect_url = url.URL(
'oracle',
username='db_username',
password='db_password',
host='db_host',
port='db_port',
query=dict(service_name='db_service_name'))
engine = create_engine(connect_url)
try:
engine.connect()
except Exception as error:
print(error)
return
Run Code Online (Sandbox Code Playgroud)
就像其他人提到的那样,您可以使用检查方法来获取表名称。
但就我而言,检查方法返回的表列表不完整。
因此,我找到了另一种在 sqlalchemy 中使用纯 SQL 查询来查找表名的方法。
query = text("SELECT table_name FROM all_tables where owner = '%s'"%str('db_username'))
table_name_data = self.session.execute(query).fetchall()
Run Code Online (Sandbox Code Playgroud)
只是为了答案的完整性,这里是通过检查方法获取表名称的代码(如果它适合您的情况)。
inspector = inspect(engine)
table_names = inspector.get_table_names()
Run Code Online (Sandbox Code Playgroud)