对于arg 10 </class>,InterfaceError未知类型<class'teen.decimal'=“”>

时间:2013-03-07 14:13:25

标签: python django google-app-engine google-cloud-sql

我正在尝试从我的数据库中获取一些数据。这在我的本地计算机上运行良好。但是当部署在Google App Engine上时,它会给我一个错误

  

InterfaceError at / report / unit / D8500 / WV_herverkoop / 2013/0/10 /   未知类型&lt; class'minit.Decimal'&gt;对于arg 10

完整追溯

    InterfaceError at /report/unit/D8500/WV_herverkoop/2013/0/10/
unknown type <class 'decimal.Decimal'> for arg 10
Request Method: GET
Request URL:    http://dw-services.appspot.com/report/unit/D8500/WV_herverkoop/2013/0/10/
Django Version: 1.4.3
Exception Type: InterfaceError
Exception Value:    
unknown type <class 'decimal.Decimal'> for arg 10
Exception Location: /python27_runtime/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py in _AddBindVariablesToRequest, line 427
Python Executable:  /python27_runtime/python27_dist/python
Python Version: 2.7.3
Python Path:    
['/base/data/home/apps/s~dw-services/2.365787501016750085',
 '/python27_runtime/python27_dist/lib/python27.zip',
 '/python27_runtime/python27_dist/lib/python2.7',
 '/python27_runtime/python27_dist/lib/python2.7/plat-linux2',
 '/python27_runtime/python27_dist/lib/python2.7/lib-tk',
 '/python27_runtime/python27_dist/lib/python2.7/lib-old',
 '/python27_runtime/python27_dist/lib/python2.7/lib-dynload',
 '/python27_runtime/python27_dist/lib/python2.7/site-packages',
 '/python27_runtime/python27_lib/versions/1',
 '/python27_runtime/python27_lib/versions/third_party/django-1.4',
 '/python27_runtime/python27_lib/versions/third_party/webapp2-2.3',
 '/python27_runtime/python27_lib/versions/third_party/webob-1.1.1',
 '/python27_runtime/python27_lib/versions/third_party/yaml-3.10',
 '/base/data/home/apps/s~dw-services/2.365787501016750085/..']
Server time:    don, 7 Mrt 2013 13:58:28 +0000
Traceback Switch to copy-and-paste view

/python27_runtime/python27_lib/versions/third_party/django-1.4/django/core/handlers/base.py in get_response
                        response = callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/contrib/auth/decorators.py in _wrapped_view
                return view_func(request, *args, **kwargs) ...
▶ Local vars
/base/data/home/apps/s~dw-services/2.365787501016750085/dewaelereports/views/reportView.py in showReportPerOffice
        position = 0           # position in which we'll insert the region
        region_commission = 0  # commission earned in a region
        region_count = 0       # transactions in a region
        region_avg = 0         # average in a region
        counter = 0            # detect when it's the first zip in the region
        for zip in region.zips.all():
            results = zip.get_total_sales(office, start_week, end_week, year, unit_type) ...
            total_count += results[0][0]
            total_commission += results[0][1]
            region_count += results[0][0]
            region_commission += results[0][1]
            zipList.append((zip.zip_name, results[0], results[1]))
            if counter == 0:
▶ Local vars
/base/data/home/apps/s~dw-services/2.365787501016750085/dewaelereports/models.py in get_total_sales
        return [calculate_results(zip_transactions, unit), zip_transactions] ...
▼ Local vars
Variable    Value
office  
<Office: D8500>
transactions    
[<Transaction: k08071>, <Transaction: T8500-08157C>, <Transaction: D8500-11451>, <Transaction: D8500-12042H>, <Transaction: D8500-12143B>, <Transaction: T8500-09259>, <Transaction: T8500-10244a>, <Transaction: T8500-10277>, <Transaction: T8500-10277>, <Transaction: D8500-10345-A12>, <Transaction: T8500-10420>, <Transaction: T8500-10496>, <Transaction: T8500-11040H>, <Transaction: D8500-11048>, <Transaction: D8500-11650H>, <Transaction: D8500-11255B>, <Transaction: T8500-11325>, <Transaction: D8500-11343H>, <Transaction: T8500-11497>, <Transaction: D8500-11508B>, '...(remaining elements truncated)...']
start_week  
u'0'
self    
<Zip: 8500 - Kortrijk>
zip_transactions    
[<Office_per_transaction: 2460>, <Office_per_transaction: 2413>, <Office_per_transaction: 775>, <Office_per_transaction: 2477>, <Office_per_transaction: 2414>, <Office_per_transaction: 2485>]
unit    
<Unit_type: WV herverkoop>
year    
u'2013'
office_transactions 
[<Office_per_transaction: 196>, <Office_per_transaction: 1111>, <Office_per_transaction: 2460>, <Office_per_transaction: 2433>, <Office_per_transaction: 1105>, <Office_per_transaction: 1135>, <Office_per_transaction: 2413>, <Office_per_transaction: 775>, <Office_per_transaction: 3176>, <Office_per_transaction: 3444>, <Office_per_transaction: 2477>, <Office_per_transaction: 2414>, <Office_per_transaction: 1094>, <Office_per_transaction: 2485>]
end_week    
u'10'
/base/data/home/apps/s~dw-services/2.365787501016750085/dewaelereports/models.py in calculate_results
    if len(transaction_query) >= 1:
        sum = 0
        for tr in transaction_query:
            sum += tr.transaction.commission_fix_out * (tr.office_percentage / 100)
        if unit:
            if unit.min_quantity:
                count_transactions = len(transaction_query.filter(transaction__transaction_price_out__gt=str(unit.min_quantity))) ...
        if not unit or not unit.min_quantity:
            count_transactions = len(transaction_query)
        avg = sum / len(transaction_query)
▼ Local vars
Variable    Value
transaction_query   
[<Office_per_transaction: 2460>, <Office_per_transaction: 2413>, <Office_per_transaction: 775>, <Office_per_transaction: 2477>, <Office_per_transaction: 2414>, <Office_per_transaction: 2485>]
count_transactions  
0
sum 
Decimal('61313.0300')
tr  
<Office_per_transaction: 2485>
avg 
0
unit    
<Unit_type: WV herverkoop>
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/db/models/query.py in __len__
                self._result_cache = list(self.iterator()) ...
▶ Local vars
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/db/models/query.py in iterator
        for row in compiler.results_iter(): ...
▶ Local vars
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/db/models/sql/compiler.py in results_iter
        for rows in self.execute_sql(MULTI): ...
▶ Local vars
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/db/models/sql/compiler.py in execute_sql
        cursor.execute(sql, params) ...
▶ Local vars
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/db/backends/util.py in execute
            return self.cursor.execute(sql, params) ...
▶ Local vars
/python27_runtime/python27_lib/versions/third_party/django-1.4/django/db/backends/mysql/base.py in execute
            return self.cursor.execute(query, args) ...
▶ Local vars
/python27_runtime/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py in execute
    request = sql_pb2.ExecRequest()
    request.options.include_generated_keys = True
    if args is not None:
      if not hasattr(args, '__iter__'):
        args = [args]
      self._AddBindVariablesToRequest(
          statement, args, request.bind_variable.add) ...
    request.statement = _ConvertFormatToQmark(statement, args)
    self._DoExec(request)
    self._executed = request.statement
  def executemany(self, statement, seq_of_args):
    """Prepares and executes a database operation for given parameter sequences.
▼ Local vars
Variable    Value
self    
<google.storage.speckle.python.api.rdbms.Cursor object at 0xfc8c0b10>
args    
(1,
 0,
 10,
 '2013-01-01 00:00:00',
 '2013-12-31 23:59:59.99',
 'R',
 'S',
 13,
 2,
 1459,
 Decimal('75000'))
request 
<google.storage.speckle.proto.sql_pb2.ExecRequest object at 0xfc8a6458>
statement   
'SELECT `dewaelereports_office_per_transaction`.`id`, `dewaelereports_office_per_transaction`.`office_id`, `dewaelereports_office_per_transaction`.`transaction_id`, `dewaelereports_office_per_transaction`.`office_percentage` FROM `dewaelereports_office_per_transaction` INNER JOIN `dewaelereports_transaction` ON (`dewaelereports_office_per_transaction`.`transaction_id` = `dewaelereports_transaction`.`id`) WHERE (`dewaelereports_office_per_transaction`.`office_id` = %s  AND `dewaelereports_transaction`.`transaction_end_week` BETWEEN %s and %s AND `dewaelereports_transaction`.`transaction_end_date` BETWEEN %s and %s AND `dewaelereports_transaction`.`transaction_end_status` IN (%s, %s) AND `dewaelereports_office_per_transaction`.`transaction_id` IN (SELECT U0.`transaction_id` FROM `dewaelereports_transaction_status` U0 WHERE U0.`status` = %s ) AND `dewaelereports_transaction`.`unit_type_id` = %s  AND `dewaelereports_office_per_transaction`.`transaction_id` IN (SELECT U0.`id` FROM `dewaelereports_transaction` U0 INNER JOIN `dewaelereports_property` U1 ON (U0.`premises_id` = U1.`id`) WHERE U1.`property_zip_id` = %s ) AND `dewaelereports_transaction`.`transaction_price_out` > %s )'
/python27_runtime/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py in _AddBindVariablesToRequest
          raise InterfaceError('unknown type %s for arg %d' % (type(arg), i)) ...
▼ Local vars
Variable    Value
direction   
1
i   
10
bind_variable_factory   
<bound method RepeatedCompositeFieldContainer.add of [<google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c14c8>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c17a0>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1960>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1998>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1f10>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1dc0>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c17d8>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1c70>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c15a8>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1d50>, <google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1ed8>]>
args    
(1,
 0,
 10,
 '2013-01-01 00:00:00',
 '2013-12-31 23:59:59.99',
 'R',
 'S',
 13,
 2,
 1459,
 Decimal('75000'))
bv  
<google.storage.speckle.proto.client_pb2.BindVariableProto object at 0xfc8c1ed8>
statement   
'SELECT `dewaelereports_office_per_transaction`.`id`, `dewaelereports_office_per_transaction`.`office_id`, `dewaelereports_office_per_transaction`.`transaction_id`, `dewaelereports_office_per_transaction`.`office_percentage` FROM `dewaelereports_office_per_transaction` INNER JOIN `dewaelereports_transaction` ON (`dewaelereports_office_per_transaction`.`transaction_id` = `dewaelereports_transaction`.`id`) WHERE (`dewaelereports_office_per_transaction`.`office_id` = %s  AND `dewaelereports_transaction`.`transaction_end_week` BETWEEN %s and %s AND `dewaelereports_transaction`.`transaction_end_date` BETWEEN %s and %s AND `dewaelereports_transaction`.`transaction_end_status` IN (%s, %s) AND `dewaelereports_office_per_transaction`.`transaction_id` IN (SELECT U0.`transaction_id` FROM `dewaelereports_transaction_status` U0 WHERE U0.`status` = %s ) AND `dewaelereports_transaction`.`unit_type_id` = %s  AND `dewaelereports_office_per_transaction`.`transaction_id` IN (SELECT U0.`id` FROM `dewaelereports_transaction` U0 INNER JOIN `dewaelereports_property` U1 ON (U0.`premises_id` = U1.`id`) WHERE U1.`property_zip_id` = %s ) AND `dewaelereports_transaction`.`transaction_price_out` > %s )'
arg 
Decimal('75000')
self    
<google.storage.speckle.python.api.rdbms.Cursor object at 0xfc8c0b10>

显然它失败了,因为它说unit.min_quantity是小数。但我没有在模型中将其声明为十进制:

class Unit_type(models.Model):
    unit_name = models.CharField(max_length=145)
    department = models.ForeignKey(Department)
    min_quantity = models.IntegerField(blank=True, null=True)

    class Meta:
        verbose_name = 'unit type'

    def __unicode__(self):
        return self.unit_name

当我填写声明并在Google Cloud Sql中手动执行时,它确实有效。有人可以帮我解决这个讨厌的问题吗?

由于

1 个答案:

答案 0 :(得分:0)

Google Cloud SQL DBAPI目前不支持decimal.Decimal类型,但您可以将其修补为:

import decimal  
from google.storage.speckle.proto import jdbc_type

from google.storage.speckle.python.api import converters  
from google.storage.speckle.python.api import rdbms  
from google.storage.speckle.python.api import rdbms_googleapi

rdbms._PYTHON_TYPE_TO_JDBC_TYPE[decimal.Decimal] = jdbc_type.DECIMAL  
converters.conversions[decimal.Decimal] = converters.Any2Str  
converters.conversions[jdbc_type.DECIMAL] = decimal.Decimal  

记录了一个问题here,Google代表提供了上面的补丁,并表示他们正在修复此问题。