2011-06-24 18 views

cevap

52

Tüm tablolar sqlalchemy MetaData nesnesinin tables özniteliğinde toplanır.

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

Eğer bildirim uzantısı kullanıyorsanız, o zaman muhtemelen meta kendi başına yönetme değildir: sadece bu tabloların isim listesini almak için. Neyse ki, meta, hala BaseClass bulunduğundan

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

sonra yapabilirsiniz, tablolar bile bile henüz hakkında SQLAlchemy söylemedim olanlar arasından, veritabanınızda mevcut anlamaya çalışıyorsanız Tablo yansımasını kullan. sqlalchemy daha sonra veritabanını denetleyecek ve meta verileri tüm eksik tablolarla güncelleyecektir.

>>> metadata.reflect(engine) 
+3

Sürüm 0.8'den beri geçersiz: Lütfen sqlalchemy.schema.MetaData.reflect() yöntemini kullanın. Ve dikkat edin, 'engine = sqlalchemy.create_engine (' mysql: // user: password @ host/db_name ') 'yerine' 'mysql: // user: password @ host'' ve 'engine.execute ('db_name kullanın ") '. –

+0

@XuJiawan: Burada hangi şeyin kullanımdan kaldırıldığından emin değilim, "sqlalchemy.MetaData.reflect()" değilse hangi yöntemi önerdiğimi bilmiyorum. – SingleNegationElimination

+0

@IfLoop: Bunu [sqlalchemy belgesinden] buldum (http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.MetaData.params.reflect). –

4

Tabloları oluşturduğunuz meta veri nesnesi, bir sözlükte yer alır.

metadata.tables.keys() 
30

tablo adını listesini almak için engine nesnesinde bir yöntem yoktur. engine.table_names()

+0

i 'traceback (son En son çağrı) olsun: Dosya "dedup_jobs.py", çizgi 31 baskı (engine.table_names()) Dosya "/Users/darshanchoudhary/.virtualenvs/services/lib/ python3.6/site-packages/sqlalchemy/engine/base.py ", satır 2128, table_names içinde return self.dialect.get_table_names (bağla, şema) value = value.replace (self.escape_quote, self.escape_to_quote) AttributeError: 'NoneType' nesnesinin 'replace'' özniteliği yok (yığın kesilmiş) –

6

Böyle bir şey arıyordu:

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() 

Bir yürütmek ve tüm tabloları döndürür gelmez.

Postgres: güncelleme

kere tüm Tabloları yansıtan

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

Bu, platformlar arası değil. Sadece mysql ile çalışacak, diğer veritabanı motorları ile çalışmayacak. –

+0

@EdwardBetts haklısın, hangi db motoru merak ediyordun? – jmunsch

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

ile geldi ve bu yazı bulundu. Bazı deneyin vadede sonra tüm tabloları listelemek için aşağıdaki kullanımını öneririm: (zerocog tarafından bahsedilen)

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

Bu doğrudan tablo işlemesi için kullanışlıdır ve hissediyorum önerilir.

Ve tablo adlarını almak için kod aşağıda kullanın:

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

"metadata.tables" tablo adı ve Tablo nesnesi için bir Dict sağlar. Bu da hızlı sorgu için yararlı olacaktır.

İlgili konular