Я хочу реализовать функцию, которая предоставляет информацию обо всех таблицах (и их именах столбцов), которые присутствуют в базе данных (а не только те, которые созданы с помощью SQLAlchemy). Читая документацию, мне кажется, что это делается через отражение, но мне не удалось что-то сделать. Любые предложения или примеры того, как это сделать?
Список таблиц базы данных с SQLAlchemy
Ответ 1
начать с движка:
from sqlalchemy import create_engine
engine = create_engine("postgresql://u:[email protected]/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
Ответ 2
Привет, я создал небольшой модуль, который помогает легко отражать все таблицы в базе данных, с которой вы подключаетесь с 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)
Ответ 3
Хотя размышление/проверка полезны, у меня были проблемы с получением данных из базы данных. Я обнаружил, что 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.
Ответ 4
Сначала настройте движок 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, был неполным.
Итак, я нашел другой способ найти имена таблиц, используя чистые SQL-запросы в sqlalchemy.
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()