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.
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:
Tất cả các bảng được thu thập trong tables
thuộ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)
sqlalchemy.MetaData.reflect()
?
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.
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ơ.
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()
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)
DB.engine.table_names()
hoặc bất kỳ tên nào của biến cơ sở dữ liệu.
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
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()
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')
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.
reflect
, metadata.sorted_tables
sẽ không hoạt động
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
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
hơn là"mysql://user:password@host"
vàengine.execute("use db_name")
.