2014-12-16 2 views
1

У меня есть следующая модель Peewee Stock. Я пытаюсь позвонить setFetchActive() используя Stock.get(Stock.id == 1).setFetchActive(). Однако я получаю ошибку ниже.Peewee self save issue (update query)

class Stock(BaseModel): 
    id = PrimaryKeyField() 
    code = CharField(db_column='code', max_length=16) 
    symbol= CharField(db_column='symbol', max_length=64) 
    createdAt = DateTimeField(default=datetime.datetime.now,db_column='created_at') 
    fetch_active = BooleanField(default=False,db_column = 'fetch_active') 
    fetchToggleTime = DateTimeField(null = True,db_column='fetch_toggle_time') 
def setFetchActive(self): 
    self.fetch_active = True 
    self.fetchToggleTime = datetime.datetime.now 
    self.save() 
    return self 

Произошла ошибка. Кажется, что проблема связана с self.save(). Выбор происходит нормально. Что я здесь делаю неправильно?

KeyError         Traceback (most recent call last) 
<ipython-input-56-306d3b2f1e40> in <module>() 
----> 1 Stock.get(Stock.id == 1).setFetchActive() 

<ipython-input-55-2d6a9ec95dab> in setFetchActive(self) 
    15   self.fetch_active = True 
    16   self.fetchToggleTime = datetime.datetime.now 
---> 17   self.save() 
    18   return self 
    19  class Meta: 

C:\Anaconda\lib\site-packages\peewee.pyc in save(self, force_insert, only) 
    3555    else: 
    3556     field_dict = self._prune_fields(field_dict, self.dirty_fields) 
-> 3557    rows = self.update(**field_dict).where(self._pk_expr()).execute() 
    3558   else: 
    3559    pk = self._get_pk_value() 

C:\Anaconda\lib\site-packages\peewee.pyc in execute(self) 
    2529 
    2530  def execute(self): 
-> 2531   return self.database.rows_affected(self._execute()) 
    2532 
    2533 class InsertQuery(Query): 

C:\Anaconda\lib\site-packages\peewee.pyc in _execute(self) 
    2162  def _execute(self): 
    2163   sql, params = self.sql() 
-> 2164   return self.database.execute_sql(sql, params, self.require_commit) 
    2165 
    2166  def execute(self): 

C:\Anaconda\lib\site-packages\peewee.pyc in execute_sql(self, sql, params, require_commit) 
    2759    cursor = self.get_cursor() 
    2760    try: 
-> 2761     cursor.execute(sql, params or()) 
    2762    except Exception as exc: 
    2763     if self.get_autocommit() and self.autorollback: 

C:\Anaconda\lib\site-packages\pymysql\cursors.pyc in execute(self, query, args) 
    128 
    129   if args is not None: 
--> 130    query = query % self._escape_args(args, conn) 
    131 
    132   result = self._query(query) 

C:\Anaconda\lib\site-packages\pymysql\cursors.pyc in _escape_args(self, args, conn) 
    94  def _escape_args(self, args, conn): 
    95   if isinstance(args, (tuple, list)): 
---> 96    return tuple(conn.escape(arg) for arg in args) 
    97   elif isinstance(args, dict): 
    98    return dict((key, conn.escape(val)) for (key, val) in args.items()) 

C:\Anaconda\lib\site-packages\pymysql\cursors.pyc in <genexpr>((arg,)) 
    94  def _escape_args(self, args, conn): 
    95   if isinstance(args, (tuple, list)): 
---> 96    return tuple(conn.escape(arg) for arg in args) 
    97   elif isinstance(args, dict): 
    98    return dict((key, conn.escape(val)) for (key, val) in args.items()) 

C:\Anaconda\lib\site-packages\pymysql\connections.pyc in escape(self, obj) 
    688   if isinstance(obj, str_type): 
    689    return "'" + self.escape_string(obj) + "'" 
--> 690   return escape_item(obj, self.charset) 
    691 
    692  def literal(self, obj): 

C:\Anaconda\lib\site-packages\pymysql\converters.pyc in escape_item(val, charset) 
    22  if type(val) is dict: 
    23   return escape_dict(val, charset) 
---> 24  encoder = encoders[type(val)] 
    25  val = encoder(val) 
    26  if type(val) in [str, int, text_type]: 

KeyError: <type 'builtin_function_or_method'> 

ответ

1

Именно эта линия:

self.fetchToggleTime = datetime.datetime.now 

Вместо этого она должна быть:

self.fetchToggleTime = datetime.datetime.now() 

Читать отслеживающий внимательно :)

+0

Спасибо. Это сделал трюк! Однако, можете ли вы указать мне, где в трассировке это указывает на то, что проблема? Исходя из java, динамическая типизация - это боль – Mayank