SQLAlchemy - Lấy danh sách các bảng


94

Tôi không thể tìm thấy bất kỳ thông tin nào về điều này trong tài liệu, nhưng làm cách nào để có được danh sách các bảng được tạo trong SQLAlchemy?

Tôi đã sử dụng phương thức lớp để tạo bảng.

Câu trả lời:


86

Tất cả các bảng được thu thập trong tablesthuộc tính của đối tượng SQLAlchemy MetaData. Để có danh sách tên của các bảng đó:

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

Nếu bạn đang sử dụng tiện ích mở rộng khai báo, thì có thể bạn đang không tự quản lý siêu dữ liệu. May mắn thay, siêu dữ liệu vẫn còn trên baseclass,

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

Nếu bạn đang cố gắng tìm ra những bảng nào có trong cơ sở dữ liệu của mình, ngay cả trong số những bảng mà bạn thậm chí chưa nói với SQLAlchemy về nó, thì bạn có thể sử dụng phản chiếu bảng. Sau đó SQLAlchemy sẽ kiểm tra cơ sở dữ liệu và cập nhật siêu dữ liệu với tất cả các bảng bị thiếu.

>>> metadata.reflect(engine)

Đối với Postgres, nếu bạn có nhiều lược đồ, bạn sẽ cần lặp qua tất cả các lược đồ trong công cụ:

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)

7
Không được chấp nhận kể từ phiên bản 0.8: Vui lòng sử dụng phương thức sqlalchemy.schema.MetaData.reflect (). Và lưu ý, sử dụng engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')hơn là "mysql://user:password@host"engine.execute("use db_name").
Java Xu

@XuJiawan: Tôi không chắc thứ nào không được dùng nữa ở đây, tôi không chắc phương pháp nào tôi đang đề xuất nếu không sqlalchemy.MetaData.reflect()?
SingleNegationElimination

@IfLoop: Tôi tìm thấy nó từ tài liệu sqlalchemy .
Java Xu

1
@XuJiawan: Các liên kết cho thấy reflect lập luận để MetaData.__init__, một lá cờ boolean, bị phản đối ủng hộ của việc sử dụng MetaData.reflect(), chính xác như tôi đã trình bày trong câu trả lời của tôi.
SingleNegationElimination

2
@IfLoop: Rất tiếc vì tiếng Anh kém của tôi. Câu trả lời của bạn là chính xác và tôi đã sửa nó. Tôi thêm nhận xét đó chỉ để mọi người lưu ý rằng nếu họ sử dụng phiên bản <0.8, họ có thể không sử dụng MetaData.reflect()phương pháp theo cách này. Và cũng bình luận nó cho người khác có thể gặp vấn đề tương tự do khai báo động cơ.
Java Xu

78

Có một phương thức trong engineđối tượng để tìm nạp danh sách tên bảng.engine.table_names()


tôi nhận được 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'(stack cắt ngắn)
Darshan Chaudhary

Điều này cũng hoạt động với Flask-SQLAlchemy , vì có quyền truy cập trực tiếp vào công cụ thông qua ví dụ DB.engine.table_names()hoặc bất kỳ tên nào của biến cơ sở dữ liệu.
colidyre

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

3
Đây là câu trả lời chính xác có hiệu lực vào tháng 11 năm 2018.
Austin Mackillop

Nếu nó không hoạt động thì đó là nhiều khả năng do động cơ không thể kết nối một cách chính xác (do đó, một vấn đề trong dòng 2) nhưng bạn sẽ không nhận được thông báo lỗi cho đến khi bạn chạyengine.table_names()
grofte

Sử dụng câu trả lời này mọi người.
Manakin

12

Trong trình thông dịch python, hãy sử dụng db.engine.table_names ()

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

11

Tôi đang tìm kiếm một cái gì đó như thế này:

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

Nó thực hiện và trả về tất cả các bảng.

cập nhật:

Postgres:

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

3
Đây không phải là nền tảng chéo. Nó sẽ chỉ hoạt động với mysql, nó sẽ không hoạt động với các công cụ cơ sở dữ liệu khác.
Edward Betts

@EdwardBetts bạn nói đúng, bạn băn khoăn về công cụ db nào?
jmunsch

OP đã yêu cầu postgres không phải sql
o elhajoui

4

Đối tượng siêu dữ liệu mà bạn đã tạo bảng có đối tượng đó trong từ điển.

metadata.tables.keys()

4

Tôi đang giải quyết vấn đề tương tự và tìm thấy bài đăng này. Sau một số lần chạy thử, tôi khuyên bạn nên sử dụng bên dưới để liệt kê tất cả các bảng: (được đề cập bởi zerocog)

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

Điều này rất hữu ích cho việc xử lý bảng trực tiếp và tôi cảm thấy được khuyến khích.

Và sử dụng mã dưới đây để lấy tên bảng:

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

"metadata.tables" cung cấp một Số liệu cho tên bảng và đối tượng Bảng. điều này cũng sẽ hữu ích cho truy vấn nhanh.


điều này! không có reflect, metadata.sorted_tablessẽ không hoạt động
Kay

2

Phản ánh tất cả các bảng cùng một lúc cho phép bạn truy xuất tên bảng ẩn. Tôi đã tạo một số bảng tạm thời và chúng hiển thị với

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

Tham khảo http://docs.sqlalchemy.org/en/latest/core/reflection.html


2

Chỉ đơn giản thế này:

engine.table_names()

Ngoài ra, để kiểm tra xem một bảng có tồn tại hay không:

engine.has_table(table_name)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.