SQLAlchemy - Tablo listesi alma


102

Belgelerde bununla ilgili herhangi bir bilgi bulamadım, ancak SQLAlchemy'de oluşturulan tabloların bir listesini nasıl alabilirim?

Tabloları oluşturmak için sınıf yöntemini kullandım.

Yanıtlar:


92

Tüm tablolar tables, SQLAlchemy MetaData nesnesinin özniteliğinde toplanır . Bu tabloların isimlerinin bir listesini almak için:

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

Bildirime dayalı uzantıyı kullanıyorsanız, muhtemelen meta verileri kendiniz yönetmiyorsunuzdur. Neyse ki, meta veriler hala temel sınıfta mevcut.

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

Veritabanınızda hangi tabloların bulunduğunu anlamaya çalışıyorsanız, SQLAlchemy'ye henüz bahsetmediğiniz tablolar arasında bile, tablo yansımasını kullanabilirsiniz. SQLAlchemy daha sonra veritabanını inceleyecek ve meta verileri tüm eksik tablolarla güncelleyecektir.

>>> metadata.reflect(engine)

Postgres için, birden fazla şemanız varsa, motordaki tüm şemalar arasında döngü yapmanız gerekir:

from sqlalchemy import inspect
inspector = inspect(engine)
schemas = inspector.get_schema_names()

for schema in schemas:
    print("schema: %s" % schema)
    for table_name in inspector.get_table_names(schema=schema):
        for column in inspector.get_columns(table_name, schema=schema):
            print("Column: %s" % column)

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

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

@IfLoop: Bunu sqlalchemy belgesinden buldum .
Java Xu

1
@XuJiawan: bağlantı olduğunu göstermektedir reflect argüman için MetaData.__init__bir boolean bayrak, itiraz edildi, lehine kullanmanın MetaData.reflect()benim cevap göstermiştir aynen.
SingleNegationElimination

2
@IfLoop: Zayıf İngilizcem için çok üzgünüm. Cevabınız kesinlikle doğru ve ben onu yükselttim. Bu yorumu sadece insanların <0.8 sürümünü kullanırlarsa MetaData.reflect(), bu şekilde yöntemi kullanamayabileceklerini fark etmelerini sağlamak için ekledim . Ayrıca, motor bildiriminden kaynaklanan aynı soruna sahip olabilecek başka biri için de yorum yapın.
Java Xu

83

engineNesnede tabloların adını almak için bir yöntem vardır .engine.table_names()


i get Traceback (most recent call last): File "dedup_jobs.py", line 31, in <module> print(engine.table_names()) File "/Users/darshanchoudhary/.virtualenvs/services/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2128, in table_names return self.dialect.get_table_names(conn, schema) value = value.replace(self.escape_quote, self.escape_to_quote) AttributeError: 'NoneType' object has no attribute 'replace'(yığın kesildi)
Darshan Chaudhary

Bu aynı zamanda Flask-SQLAlchemy ile de çalışır , çünkü motora örneğin DB.engine.table_names()veya veritabanı değişkeninin adı ne olursa olsun doğrudan erişim vardır .
colidyre

48
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())

3
Kasım 2018 itibarıyla geçerli olan doğru cevap budur.
Austin Mackillop

engine.table_names()
Çalışmazsa

Bu cevabı kullanın insanlar.
Manakin

13

Python yorumlayıcı içinde db.engine.table_names () kullanın

$ python
>>> from myapp import db
>>> db.engine.table_names()

10

Bunun gibi bir şey arıyordum:

from sqlalchemy import create_engine
eng = create_engine('mysql+pymysql://root:password@localhost:3306', pool_recycle=3600)
q = eng.execute('SHOW TABLES')

available_tables = q.fetchall()

Yürütür ve tüm tabloları döndürür.

Güncelleme:

Postgres:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')

4
Bu, çapraz platform değildir. Sadece mysql ile çalışacak, diğer veritabanı motorları ile çalışmayacaktır.
Edward Betts

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

OP, sql değil postgres istedi
o elhajoui

5

Tabloları oluşturduğunuz meta veri nesnesi, bunu bir sözlükte içerir.

metadata.tables.keys()

5

Aynı sorunu çözüyorum ve bu yazıyı buldum. Biraz çalıştırmayı denedikten sonra, tüm tabloları listelemek için aşağıdakileri kullanmanızı öneririm: (zerocog tarafından bahsedilir)

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

Bu, doğrudan masa kullanımı için kullanışlıdır ve tavsiye edildiğini düşünüyorum.

Ve tablo adlarını almak için aşağıdaki kodu 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ı sorgulama için yararlı olacaktır.


bu! olmadan reflect, metadata.sorted_tablesişe yaramaz
Kay


2

Sadece bu kadar basit:

engine.table_names()

Ayrıca, bir tablonun var olup olmadığını test etmek için:

engine.has_table(table_name)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.