2014-10-22 12 views
7

Sau một cơ sở dữ liệu được xây dựng trong SQLAlchemy, tôi muốn để có được tất cả các mô hình, mà là để nói, các lớp học mà đại diện cho họNhận tất cả các mô hình từ bình-SQLAlchemy db

>>> db 
<SQLAlchemy engine='postgresql:///example'> 
>>> ??? 
[<db.Model 'User'>, <db.Model 'Comment'>, <db.Model 'Article'>] 

thể này thể đạt được? Làm sao?

Tôi có thể nhận được các bảng một cách rõ ràng, không chỉ các mô hình. Ví dụ:

>>> for t in db.metadata.tables.items(): 
     print(t) 

này cung cấp cho các bảng chỉ không phải là mô hình tự

Trả lời

7

Có một số câu hỏi liên quan, nhưng tôi không thấy bất kỳ bản sao chính xác.

Sử dụng mã của bạn để lấy tên bảng và câu trả lời được chấp nhận của this question để nhận các lớp học, chúng tôi có thể so khớp các lớp với các tab được đăng ký trên cơ sở dữ liệu của bạn.

classes, models, table_names = [], [], [] 
for clazz in db.Model._decl_class_registry.values(): 
    try: 
     table_names.append(clazz.__tablename__) 
     classes.append(clazz) 
    except: 
     pass 
for table in db.metadata.tables.items(): 
    if table[0] in table_names: 
     models.append(classes[table_names.index(table[0])]) 

đâu models là danh sách các mô hình registed trên cơ sở dữ liệu của bạn.

Cần thử bắt buộc vì <sqlalchemy.ext.declarative.clsregistry._ModuleMarker object> sẽ được bao gồm trong vòng for clazz in ... và không có thuộc tính __tablename__.

0

tính năng này hoạt động trong trường hợp của tôi: hơi ngắn hơn; dễ đọc hơn

models = [] 
for name, thing in db_table_creation.__dict__.iteritems(): 
    if isinstance(thing, sqlalchemy.ext.declarative.DeclarativeMeta) and hasattr(thing, '__tablename__'): 
     models.append(thing) 
+2

nơi db_table_creation đến từ – codyc4321

3

Nếu bạn chỉ cần các lớp học, có một giải pháp đơn giản hơn. Tôi đã đưa ra với nó dựa trên Celeo’s answer:

from flask import current_app 

# This is to be generic (ie. no need to pass your actual SQLAlchemy instance) 
# This way you can include it even in your own extension. 
db = current_app.extensions['sqlalchemy'].db 

[cls for cls in db.Model._decl_class_registry.values() 
if isinstance(cls, type) and issubclass(cls, db.Model)] 

này không cần tất cả những biến helper thêm, chỉ cần truy vấn đăng ký lớp học, và lọc ra tất cả mọi thứ đó không phải là một mô hình.

Các vấn đề liên quan