2013-07-11 65 views
1

我嘗試使用SQLAlchemy的調用用戶定義函數(表函數)。這裏是我的代碼:SQLAlchemy的用戶定義函數的錯誤

from sqlalchemy import * 
from sqlalchemy.orm import sessionmaker 

db = create_engine('mssql+pymssql://User:[email protected]/Database') 

metadata = MetaData(db) 
Session = sessionmaker(bind=db) 
session = Session() 

results = session.query(func.MyFunctionName('Value')).all() 

當這個執行我收到以下錯誤:

sqlalchemy.exc.OperationalError: (OperationalError) (195, "'MyFunctionName' is not a recognized built-in function name.DB-Lib error message 195, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n") 'SELECT MyFunctionName(%(MyFunctionName_2)s) AS [MyFunctionName_1]' {'MyFunctionName_2': 'Value'}

當我看到SQL事件探查器,我得到如下:

SELECT MyFunctionName('Value') AS [MyFunctionName_1]

還告訴我,它不是在查詢中添加SELECT * FROM MyFunctionName

什麼我需要做的就是我的session.query在查詢執行添加* FROM?

如果您需要了解更多信息,請發表評論。

回答

2

需要變成一個select()對象首先,使用所描述的圖案在http://docs.sqlalchemy.org/en/latest/core/tutorial.html#functions

myfunc = select([column('x'), column('y')]).select_from(func.myfunction()) 
session.execute(myfunc).fetchall() 
+0

這曾與的調整基於表的功能。我不得不將session.query更改爲session.execute(myfunc).fetchall()。我使用更新後的代碼編輯了您的回覆。 – CodeLikeBeaker

+0

通過選擇()查詢()應該工作爲好,它會包裝在一個額外的選擇,但你仍然會得到相同的結果。你的SQLAlchemy的輸出/版本是什麼? – zzzeek

+0

它看起來我需要一個別名爲我包裹的子選擇。所以「從myfunc()中選擇列作爲A – CodeLikeBeaker