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.

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)

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


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

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

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

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

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.


ini! tanpa reflect, metadata.sorted_tablestidak akan berhasil
Kay


2

Sesederhana ini:

engine.table_names()

Juga, untuk menguji apakah tabel ada:

engine.has_table(table_name)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.