SQLAlchemy - Mendapatkan daftar tabel

99

Saya tidak dapat menemukan informasi apa pun tentang ini di dokumentasi, tetapi bagaimana saya bisa mendapatkan daftar tabel yang dibuat di SQLAlchemy?

Saya menggunakan metode kelas untuk membuat tabel.

tubrukan dr samping
sumber

Jawaban:

90

Semua tabel dikumpulkan dalam tablesatribut objek SQLAlchemy MetaData. Untuk mendapatkan daftar nama tabel tersebut:

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

Jika Anda menggunakan ekstensi deklaratif, Anda mungkin tidak mengelola metadata sendiri. Untungnya, metadata masih ada di baseclass,

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

Jika Anda mencoba mencari tahu tabel apa yang ada di database Anda, bahkan di antara tabel yang belum Anda beri tahu SQLAlchemy, Anda dapat menggunakan refleksi tabel. SQLAlchemy kemudian akan memeriksa database dan memperbarui metadata dengan semua tabel yang hilang.

>>> metadata.reflect(engine)

Untuk Postgres, jika Anda memiliki beberapa skema, Anda harus melakukan perulangan melalui semua skema di mesin:

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)
SingleNegationElimination
sumber
8
Tidak digunakan lagi sejak versi 0.8: Harap gunakan metode sqlalchemy.schema.MetaData.reflect (). Dan perhatikan, gunakan engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')daripada "mysql://user:password@host"dan engine.execute("use db_name").
Java Xu
@XuJiawan: Saya tidak yakin hal mana yang tidak digunakan lagi di sini, saya tidak yakin metode mana yang saya sarankan jika tidak sqlalchemy.MetaData.reflect()?
SingleNegationElimination
@IfLoop: Saya menemukannya dari dokumen sqlalchemy .
Java Xu
1
@XuJiawan: Tautan menyarankan bahwa reflect argumen ke MetaData.__init__, bendera boolean, tidak digunakan lagi untuk digunakan MetaData.reflect(), persis seperti yang saya tunjukkan dalam jawaban saya.
SingleNegationElimination
2
@ IfLoop: Sangat menyesal tentang bahasa Inggris saya yang buruk. Jawaban Anda benar dan saya telah meningkatkannya. Saya menambahkan komentar itu hanya untuk membuat orang memperhatikan bahwa jika mereka menggunakan versi <0.8, mereka mungkin tidak menggunakan MetaData.reflect()metode dengan cara ini. Dan juga mengomentarinya untuk orang lain yang mungkin memiliki masalah yang sama yang disebabkan oleh deklarasi mesin.
Java Xu
82

Ada metode dalam engineobjek untuk mengambil daftar nama tabel.engine.table_names()

Zubair Alam
sumber
saya mendapatkan 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'(tumpukan terpotong)
Darshan Chaudhary
Ini juga bisa digunakan dengan Flask-SQLAlchemy , karena ada akses langsung ke mesin melalui eg DB.engine.table_names()atau apapun nama variabel database.
colidyre
47
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
Maeda
sumber
3
Ini adalah jawaban yang benar yang berfungsi per November 2018.
Austin Mackillop
Jika tidak berfungsi maka kemungkinan besar karena mesin tidak dapat terhubung dengan benar (jadi masalah di baris 2) tetapi Anda tidak akan mendapatkan pesan kesalahan sampai Anda menjalankanengine.table_names()
grofte
Gunakan jawaban ini orang.
Manakin
Bagus! sederhana dan bekerja dengan baik
Soubinan
13

Dalam interpreter python gunakan db.engine.table_names ()

$ python
>>> from myapp import db
>>> db.engine.table_names()
Tim Truston
sumber
10

Saya mencari sesuatu seperti ini:

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

Itu mengeksekusi dan mengembalikan semua tabel.

memperbarui:

Postgres:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
jmunsch
sumber
3
Ini bukan lintas platform. Ini hanya akan bekerja dengan mysql, tidak akan bekerja dengan mesin database lain.
Edward Betts
@EdwardBetts Anda benar, mesin db apa yang Anda tanyakan?
jmunsch
OP meminta postgres bukan sql
o elhajoui
5

Objek metadata yang Anda buat tabelnya sudah ada di kamus.

metadata.tables.keys()
Keith
sumber
4

Saya memecahkan masalah yang sama dan menemukan posting ini. Setelah mencoba beberapa kali, saya akan menyarankan penggunaan di bawah ini untuk membuat daftar semua tabel: (disebutkan oleh zerocog)

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

Ini berguna untuk penanganan meja langsung dan saya rasa direkomendasikan.

Dan gunakan kode di bawah ini untuk mendapatkan nama tabel:

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

"metadata.tables" menyediakan Dict untuk nama tabel dan objek Tabel. yang juga berguna untuk kueri cepat.

pengguna2189731
sumber
ini! tanpa reflect, metadata.sorted_tablestidak akan berhasil
Kay
2

Mencerminkan Semua Tabel Sekaligus memungkinkan Anda untuk mengambil nama tabel yang tersembunyi juga. Saya membuat beberapa tabel sementara dan mereka muncul dengan

meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
    print table

Referensi http://docs.sqlalchemy.org/en/latest/core/reflection.html

zerocog
sumber
2

Sesederhana ini:

engine.table_names()

Juga, untuk menguji apakah tabel ada:

engine.has_table(table_name)
Han Zhang
sumber