2011-06-24 18 views

Odpowiedz

52

Wszystkie tabele są gromadzone w atrybucie sqlalchemy MetaData w atrybucie tables. aby tylko uzyskać listę nazw tych tabelach:

>>> metadata.tables.keys() 
['posts', 'comments', 'users'] 

Jeśli używasz rozszerzenia deklaratywny, to prawdopodobnie nie są zarządzający metadane samodzielnie. Na szczęście, metadane jest wciąż obecna na klasy bazowej,

>>> Base = sqlalchemy.ext.declarative.declarative_base() 
>>> Base.metadata 
MetaData(None) 

Jeśli chcesz dowiedzieć się, jakie są obecne tabele w bazie danych, nawet wśród tych, nie masz nawet powiedział SQLAlchemy o jeszcze, a potem można użyj refleksji tabeli. sqlalchemy następnie sprawdzi bazę danych i zaktualizuje metadane do wszystkich brakujących tabel.

>>> metadata.reflect(engine) 
+3

Przestarzałe od wersji 0.8: Proszę użyć metody sqlalchemy.schema.MetaData.reflect(). Zauważ, użyj 'engine = sqlalchemy.create_engine ('mysql: // user: password @ host/db_name')' zamiast '" mysql: // user: password @ host "' i 'engine.execute (" użyj db_name ")'. –

+0

@XuJiawan: Nie jestem pewien, która rzecz jest przestarzała, nie jestem pewien, która metoda sugeruje, czy to nie jest 'sqlalchemy.MetaData.reflect()'? – SingleNegationElimination

+0

@IfLoop: Znalazłem go z [dokumentu sqlalchemy] (http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.MetaData.params.reflect). –

4

Obiekt metadanych, w którym zostały utworzone tabele, ma to w słowniku.

metadata.tables.keys() 
30

Istnieje metoda w obiekcie engine, aby pobrać listę nazw tabel. engine.table_names()

+0

ja dostać 'Traceback (most recent call last): File "dedup_jobs.py ", linia 31, w druku (engine.table_names()) Plik„/Users/darshanchoudhary/.virtualenvs/services/lib/ python3.6/site-packages/sqlalchemy/engine/base.py ", wiersz 2128, w nazwach tabel return self.dialect.get_table_names (conn, schema) value = value.replace (self.escape_quote, self.escape_to_quote) AttributeError: Obiekt 'NoneType' nie ma atrybutu 'replace'' (stos obcięty) –

6

Szukałem czegoś takiego:

from sqlalchemy import create_engine 
    eng = create_engine('mysql+pymysql://root:[email protected]:3306', pool_recycle=3600) 
    q = eng.execute('SHOW TABLES') 

    available_tables = q.fetchall() 

Robi execute i zwraca wszystkie tabele.

zmiana:

Postgres:

eng = create_engine('postgresql+psycopg2://root:[email protected]/ 
q = eng.execute('SELECT * FROM pg_catalog.pg_tables') 
+3

To nie jest platforma. Będzie działać tylko z mysql, nie będzie działać z innymi silnikami baz danych. –

+0

@EdwardBetts masz rację, na czym polegał silnik db? – jmunsch

2
from sqlalchemy import create_engine 
engine = create_engine('postgresql://use:[email protected]/DBname') 
print (engine.table_names()) 
0

jestem rozwiązywania tego samego problemu i znaleźć ten post. Po pewnym okresie try, sugerowałbym użycie poniżej listę wszystkich tabel: (wspomniane przez zerocog)

metadata = MetaData() 
metadata.reflect(bind=engine) 
for table in metadata.sorted_tables: 
    print(table) 

ta jest przydatna do bezpośredniego przenoszenia stołu i czuję jest zalecane.

I skorzystać z poniższego kodu, aby uzyskać nazwy tabel:

for table_name in engine.table_names(): 
    print(table_name) 

„metadata.tables” zapewnia Dict dla nazwy tabeli i obiektu tabeli. który byłby również przydatny do szybkiego wyszukiwania.

Powiązane problemy