2016-06-21 5 views
1

SQLAchemy 및 Python을 사용하여 SQL 쿼리를 동적으로 실행하고 있습니다. 그러나 그것은 오류를주고있다. val2만큼 정수이며 메트릭은 문자열입니다, 여기SQLAlchemy : 정수 매개 변수를 전달하는 동안 쿼리에서 오류가 발생했습니다.

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

Cohort_week, VAL1 :

쿼리를 실행하는 나의 명령입니다.

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 

오류는 다음과 같습니다 : 나는 (int)로 타입 캐스팅 VAL1, val2만큼 및 주를 시도

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}] 

(즉, 사용 INT (VAL1) 등)

은 여기 내 SQL 쿼리입니다. 하지만 여전히 같은 오류.

당신은 당신이 p1p2하지만 당신이 실제로하고있는 것은 p1p2와 문자열 'pdp_views'을 비교한다과 열 pdp_views의 값을 비교하려는처럼 보이는이

+0

데이터베이스가 정수로 측정 exepects처럼 보이는합니다. 해당 부분에 대한 데이터베이스 구성표를 제공 할 수 있습니까? – syntonym

+0

데이터베이스 스키마 : week는 정수이고, pdp_views는 정수이고, id는 정수입니다. –

답변

0

좀 도와 주실 수있는 호환되지 않는 유형이 있습니다.

당신은 동적으로 대신 쿼리를 작성해야합니다

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) 
관련 문제