2016-06-21 74 views
1

我正在使用SQLAchemy和python來動態運行SQL查詢。但它給出了錯誤。SQLAlchemy:查詢傳遞整數參數時發生錯誤

這是我的命令來運行查詢:

data = engine.execute(m_query, week=Cohort_week, metric=metric, p1=val1, p2=val2).fetchall() 

這裏Cohort_week,VAL1,VAL2是整數和公制是一個字符串。

這裏是我的SQL查詢:

select cus.week,pdp_views, id, :metric, 
    case 
     when :metric <= :p2 then 3 
     when :metric > :p2 and :metric < :p1 then 2 
     when :metric >= :p1 then 1 
    end as HML 
    from 
    dev.master_abtest_customers cus 
    where cus.week= :week 

的錯誤是:

DataError         Traceback (most recent call last) 
<ipython-input-25-30f7e92cbea3> in <module>() 
    12 m_query = text(m_query) 
    13 
---> 14 data = engine.execute(m_query, week=week, metric=metric, p1=val1, p2=val2).fetchall() 
    15 
    16 data = pd.DataFrame(data) 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\base.pyc in execute(self, statement, *multiparams, **params) 
    2050 
    2051   connection = self.contextual_connect(close_with_result=True) 
-> 2052   return connection.execute(statement, *multiparams, **params) 
    2053 
    2054  def scalar(self, statement, *multiparams, **params): 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\base.pyc in execute(self, object, *multiparams, **params) 
    945     type(object)) 
    946   else: 
--> 947    return meth(self, multiparams, params) 
    948 
    949  def _execute_function(self, func, multiparams, params): 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\sql\elements.pyc in _execute_on_connection(self, connection, multiparams, params) 
    260 
    261  def _execute_on_connection(self, connection, multiparams, params): 
--> 262   return connection._execute_clauseelement(self, multiparams, params) 
    263 
    264  def unique_params(self, *optionaldict, **kwargs): 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\base.pyc in _execute_clauseelement(self, elem, multiparams, params) 
    1053    compiled_sql, 
    1054    distilled_params, 
-> 1055    compiled_sql, distilled_params 
    1056  ) 
    1057   if self._has_events or self.engine._has_events: 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\base.pyc in _execute_context(self, dialect, constructor, statement, parameters, *args) 
    1189     parameters, 
    1190     cursor, 
-> 1191     context) 
    1192 
    1193   if self._has_events or self.engine._has_events: 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\base.pyc in _handle_dbapi_exception(self, e, statement, parameters, cursor, context) 
    1384     util.raise_from_cause(
    1385      sqlalchemy_exception, 
-> 1386      exc_info 
    1387    ) 
    1388    else: 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\util\compat.pyc in raise_from_cause(exception, exc_info) 
    200  exc_type, exc_value, exc_tb = exc_info 
    201  cause = exc_value if exc_value is not exception else None 
--> 202  reraise(type(exception), exception, tb=exc_tb, cause=cause) 
    203 
    204 if py3k: 

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\base.pyc in _execute_context(self, dialect, constructor, statement, parameters, *args) 
    1182       statement, 
    1183       parameters, 
-> 1184       context) 
    1185   except Exception as e: 
    1186    self._handle_dbapi_exception(

C:\Users\MI0185\AppData\Local\Enthought\Canopy\User\lib\site-packages\sqlalchemy-1.1.0b1-py2.7-win-amd64.egg\sqlalchemy\engine\default.pyc in do_execute(self, cursor, statement, parameters, context) 
    460 
    461  def do_execute(self, cursor, statement, parameters, context=None): 
--> 462   cursor.execute(statement, parameters) 
    463 
    464  def do_execute_no_params(self, cursor, statement, context=None): 

DataError: (psycopg2.DataError) invalid input syntax for integer: "pdp_views" 
[SQL: 'select cus.week, id, %(metric)s,\n  case\n   when %(metric)s <= %(p2)s then 3\n   when %(metric)s > %(p2)s and %(metric)s < %(p1)s then 2 \n   when %(metric)s >= %(p1)s then 1\n  end as HML\n  from \n  dev.master_abtest_customers cus\n  where cus.week= %(week)s\n\t\t\n\t\t'] [parameters: {'p2': 20L, 'week': 22L, 'metric': u'pdp_views', 'p1': 40L}] 

我已經試過型鑄造VAL1,VAL2和一週INT(即使用INT(VAL1)等)。但仍然是相同的錯誤。

能否請你幫我這個

+0

它看起來像數據庫exepects指標爲整數。你可以給我們這個部分的數據庫方案嗎? – syntonym

+0

數據庫模式:周是整數,pdp_views是整數,id是整數 –

回答

0

它看起來像你想在列pdp_views值與p1p2但你實際上做的是比較字符串'pdp_views'p1p2,比較有有不兼容的類型。

你應該建立查詢而不是動態:

def get_m_query(week, metric, p1, p2): 
    cus = master_abtest_customers.alias("cus") 
    metric = getattr(cus.c, metric) 
    return select([ 
     cus.c.week, 
     cus.c.pdp_views, 
     cus.c.id, 
     metric, 
     case([ 
      (metric <= p2, 3), 
      (and_(metric > p2, metric < p1), 2), 
      (metric >= p1, 1), 
     ]).label("HML"), 
    ]).select_from(cus).where(cus.week == week)