it-swarm.com.de

Listet Datenbanktabellen mit SQLAlchemy auf

Ich möchte eine Funktion implementieren, die Informationen zu allen Tabellen (und deren Spaltennamen) enthält, die in einer Datenbank vorhanden sind (nicht nur diejenigen, die mit SQLAlchemy erstellt wurden). Beim Lesen der Dokumentation scheint mir, dass dies durch Nachdenken geschieht, aber ich habe es nicht geschafft, dass etwas funktioniert. Anregungen oder Beispiele, wie das geht?

34
drgxfs

beginnen Sie mit einem Motor:

from sqlalchemy import create_engine
engine = create_engine("postgresql://u:[email protected]/database")

schneller Pfad zu allen Tabellen-/Spaltennamen, verwenden Sie einen Inspektor:

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'])

docs: http://docs.sqlalchemy.org/de/rel_0_9/core/reflection.html?highlight=inspector#fine-grained-reflection-mit-inspector

verwenden Sie alternativ 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/de/rel_0_9/core/reflection.html#reflecting-all-tables-at-once

66
zzzeek

Hey, ich habe ein kleines Modul erstellt, das dabei hilft, alle Tabellen in einer Datenbank, mit der Sie eine Verbindung mit SQLAlchemy herstellen, einfach wiederzugeben. Sehen Sie es sich an: 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
PepperoniPizza

Richten Sie zuerst die sqlalchemy-Engine ein.

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

Wie bereits erwähnt, können Sie die inspect-Methode verwenden, um die Tabellennamen abzurufen.

In meinem Fall war die Liste der von der inspect-Methode zurückgegebenen Tabellen jedoch unvollständig.

Also habe ich einen anderen Weg gefunden, um Tabellennamen mithilfe von reinen SQL-Abfragen in sqlalchemy zu finden.

query = text("SELECT table_name FROM all_tables where owner = '%s'"%str('db_username'))

table_name_data = self.session.execute(query).fetchall()

Der Vollständigkeit halber finden Sie hier den Code zum Abrufen von Tabellennamen mit der Inspect-Methode (falls dies in Ihrem Fall gut funktioniert).

inspector = inspect(engine)
table_names = inspector.get_table_names()
0
Rohit

Während Reflection/Inspection nützlich ist, hatte ich Probleme, die Daten aus der Datenbank zu holen. Ich fand sqlsoup , um benutzerfreundlicher zu sein. Sie erstellen die Engine mit sqlalchemy und übergeben diese Engine an sqlsoup.SQlSoup. dh:

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 __== "__main__":
    test_sqlsoup()

Wenn Sie mit sqlalchemy vertraut sind, sind Sie mit sqlsoup vertraut. Ich habe dies verwendet, um Daten aus einer Wordpress-Datenbank zu extrahieren. 

0
user2682863