2016-12-16 44 views
1

如果我不清楚,我很抱歉,英語不是我的母語。 隨時告訴我,如果我犯了太多的錯誤:)如何使用字符串變量作爲表名進行sqlalchemy查詢?

我是一個新手在使用flask_sqlalchemy,並花費了數小時後在互聯網上搜索答案沮喪。

我要的是做這樣一個查詢:

ModelName.query.filter_by(name='something').all() 

,但使用的MODELNAME我想要做這樣的事情:

model_list = ['Model1', 'Model2', 'Model3'] 
for model in model_list: 
    some_var = model.query.filter_by(name='something').all() 
    # do some stuff with the variable 

的錯誤是:

'str' object has no attribute 'query' 

當嘗試使用帶有字符串變量的db.session.add()時,我當然會遇到同樣的問題。

據我所知,查詢需要某種_BoundDeclarativeMeta對象而不是字符串,但如何從列表中獲取該對象以將其傳遞給for循環?

我嘗試使用'db.metadata.tables [my_variable]',但我得到一個Table對象而不是_BoundDeclarativeMeta對象,它不能工作。

我管理使用

db.session.query(db.metadata.tables[my_variable]) 

,而不是

my_variable.query 

做了查詢,但我不能使用該方法的 'db.session.add()'(或者是可能嗎?)

是否有任何方法可以將字符串變量「轉換」爲正確類型的sqlalchemy對象?

回答

0

我覺得如果你正在使用Python> 2.7

importlib.import_module('module to import') 

對於您的情況importlib可以幫助你在這裏: 如果你的項目結構看起來像下面和models.py定義了所有的OR映射類。

a 
| 
+ - __init__.py 
    - b 
    | 
    + - __init__.py 
     - models.py 

的代碼應該是這樣的:

model_list = ['Model1', 'Model2', 'Model3'] 
the_module = importlib.import_module('module to import') # eg. importlib.import_module('a.b.models') 
for model in model_list: 
    the_class = getattr(the_module, model) 
    some_var = the_class.query.filter_by(name='something').all() 
+0

感謝您回覆:),但我真的不知道該模塊使用了「the_module」,以獲得正確類型的對象。 – cleve21

+0

@ cleve21請更新答案。 – ichbinblau

-1

我有點設法得到我想要使用

eval(my_variable) 

看來的eval()讓我得到一個數據庫對象由變量值命名而不是純字符串對象。

我看到有關使用eval()的安全警告,但我認爲它沒問題,因爲評估變量不是來自用戶輸入。

當然,如果有人看到更好的方式來做同樣的事情,我會很高興知道它。

+0

eval是不安全的 – llazzaro

1

試試這個:

mapping_str_to_object = {} 
for model in BaseModel._decl_class_registry.values(): 
      if hasattr(model, '__tablename__'): 
       mapping_str_to_object[model.__tablename__] = model 

model_list = ['Model1', 'Model2', 'Model3'] 
for model in model_list: 
    some_var = mapping_str_to_object[model].query.filter_by(name='something').all() 
相關問題