我想实现一个函数,该函数提供有关数据库中存在的所有表(及其列名)的信息(不仅仅是使用SQLAlchemy创建的表)。在阅读文档时,在我看来,这是通过反射完成的,但我没有设法使某些工作正常。有关如何执行此操作的任何建议或示例?
答案 0 :(得分:70)
从引擎开始:
from sqlalchemy import create_engine
engine = create_engine("postgresql://u:p@host/database")
所有表/列名称的快捷路径,使用检查器:
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'])
或者,使用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)
docs:http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html#reflecting-all-tables-at-once
答案 1 :(得分:3)
嘿,我创建了一个小模块,可以帮助您轻松反映与SQLAlchemy连接的数据库中的所有表,看看:EZAlchemy
from EZAlchemy.ezalchemy import EZAlchemy
DB = EZAlchemy(
db_user='username',
db_password='pezzword',
db_hostname='127.0.0.1',
db_database='mydatabase',
d_n_d='mysql' # stands for dialect+driver
)
# this function loads all tables in the database to the class instance DB
DB.connect()
# List all associations to DB, you will see all the tables in that database
dir(DB)
答案 2 :(得分:0)
尽管reflection/inspection很有用,但是我很难将数据从数据库中取出。我发现sqlsoup更加用户友好。您使用sqlalchemy创建引擎,并将该引擎传递给sqlsoup.SQlSoup。即:
import sqlsoup
def create_engine():
from sqlalchemy import create_engine
return create_engine(f"mysql+mysqlconnector://{database_username}:{database_pw}@{database_host}/{database_name}")
def test_sqlsoup():
engine = create_engine()
db = sqlsoup.SQLSoup(engine)
# Note: database must have a table called 'users' for this example
users = db.users.all()
print(users)
if __name__ == "__main__":
test_sqlsoup()
如果您熟悉sqlalchemy,则您熟悉sqlsoup。我用它来从wordpress数据库中提取数据。
答案 3 :(得分:0)
首先设置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
就像其他人提到的那样,您可以使用inspect方法获取表名。
但是对于我而言,inspect方法返回的表列表不完整。
因此,我找到了另一种通过在sqlalchemy中使用纯SQL查询来查找表名的方法。
query = text("SELECT table_name FROM all_tables where owner = '%s'"%str('db_username'))
table_name_data = self.session.execute(query).fetchall()
仅出于回答完整性的考虑,以下是通过inspect方法获取表名的代码(如果在您的情况下可行)。
inspector = inspect(engine)
table_names = inspector.get_table_names()
答案 4 :(得分:0)
我提出了另一种解决方案,因为在使用 schemas 的 postgres 的情况下,我对之前的任何解决方案都不满意。我通过查看 pandas source code 共同破解了这个解决方案。
from sqlalchemy import MetaData, create_engine
from typing import List
def list_tables(pg_uri: str, schema: str) -> List[str]:
with create_engine(pg_uri).connect() as conn:
meta = MetaData(conn, schema=schema)
meta.reflect(views=True)
return list(meta.tables.keys())
为了获取架构中所有表的列表,您需要形成 postgres 数据库 uri pg_uri
(例如 zzzeek 的答案中的 "postgresql://u:p@host/database"
)以及架构名称 {{ 1}}。因此,如果我们使用示例 uri 以及典型架构 schema
,我们将获得所有表和视图:
public