SQLAlchemy - TypeError:必须是字符串或缓冲区,而不是datetime.datetime

时间:2017-01-03 18:27:42

标签: python sqlalchemy

问题是我有几个日期列,而sqlalchemy似乎将它们错误地转换为unicode。抛出TypeError:必须是字符串或缓冲区,而不是处理器函数中的datetime.datetime。

我有一个堆栈跟踪(带有调试器的一些注释):

[2017-01-03 11:20:20,026] {C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\app.py:1587} ERROR - Exception on /api/util_tap [GET]
Traceback (most recent call last):
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask_cors\extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\base.py", line 391, in new_func
    return func(*args, **kw)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\base.py", line 340, in new_func
    return func(*args, **kw)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\base.py", line 244, in new_func
    return func(*args, **kw)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\flask\views.py", line 149, in dispatch_request
    return meth(*args, **kwargs)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\base.py", line 444, in wrapped
    return func(*args, **kw)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\resources.py", line 398, in get
    return self._get_collection()
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\resources.py", line 369, in _get_collection
    group_by=group_by, single=single)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\base.py", line 1717, in _get_collection_helper
    included = self.get_all_inclusions(instances)
  File "c:\\www\\flask_app\\virtualenv\\src\\flask-restless\flask_restless\views\base.py", line 1402, in get_all_inclusions
    to_include = set(chain(map(self.resources_to_include, instances)))

### instances is a BaseQuery object
### str(instances) is: 
'SELECT dbo.util_tap.date_created AS dbo_util_tap_date_created, dbo.util_tap.date_modified AS dbo_util_tap_date_modified, dbo.util_tap.created_by AS dbo_util_tap_created_by, dbo.util_tap.modified_by AS dbo_util_tap_modified_by, dbo.util_tap.id AS dbo_util_tap_id, dbo.util_tap.parcelid AS dbo_util_tap_parcelid, dbo.util_tap.status AS dbo_util_tap_status, dbo.util_tap.street_add AS dbo_util_tap_street_add, dbo.util_tap.prop_desc AS dbo_util_tap_prop_desc, dbo.util_tap.service_num AS dbo_util_tap_service_num, dbo.util_tap.meter_desc AS dbo_util_tap_meter_desc, dbo.util_tap.corp_desc AS dbo_util_tap_corp_desc, dbo.util_tap.curb_stop AS dbo_util_tap_curb_stop, dbo.util_tap.water_material AS dbo_util_tap_water_material, dbo.util_tap.water_date AS dbo_util_tap_water_date, dbo.util_tap.laid_by AS dbo_util_tap_laid_by, dbo.util_tap.re_laid_by AS dbo_util_tap_re_laid_by, dbo.util_tap.san_service AS dbo_util_tap_san_service, dbo.util_tap.san_laid AS dbo_util_tap_san_laid, dbo.util_tap.san_material AS dbo_util_tap_san_material, dbo.util_tap.san_date AS dbo_util_tap_san_date, dbo.util_tap.remarks AS dbo_util_tap_remarks, dbo.util_tap.file_url AS dbo_util_tap_file_url \nFROM dbo.util_tap ORDER BY dbo.util_tap.id ASC

  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\orm\loading.py", line 90, in instances
    util.raise_from_cause(err)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\util\compat.py", line 202, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\orm\loading.py", line 75, in instances
    rows = [proc(row) for row in fetch]
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\orm\loading.py", line 437, in _instance
    loaded_instance, populate_existing, populators)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\orm\loading.py", line 498, in _populate_full
    dict_[key] = getter(row)
  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\engine\result.py", line 93, in __getitem__
    return processor(self._row[index])

### self is <broken repr (TypeError: must be string or buffer, not datetime.datetime)>

### self.row is (datetime.datetime(2014, 11, 17, 0, 0), datetime.datetime(2014, 11, 17, 0, 0), u'pschulz', u'pschulz', 1259, u'1836228001', None, u'2100 GRANT ST - GOODWILL', u'BLOCK 1 LOT 2 REINEKES-1ST ADD', 7289, None, None, u'IN PARKING LOT 49\' S. OF BLDG & 69\'3" SW OF SE CORNER OF BLDG TO 6" VALVE, 1" VALVE 2\' N. & 2\' W. OF 6" VALVE', u'ST SECT-6" DUCTILE                  YD SEC-1" BLUE POLY W/TRACER', datetime.datetime(2014, 11, 7, 0, 0), u'MN UTILITIES & EXCAVATING -10/7/2014', None, u"NOT SAME TRENCH AS WATER, SEWER DEPTH-8', WATERMAIN DEPTH 7'", u'MN UTILITIES & EXCAVATING -10/7/2014', u'ST SEC-                                                          YD SEC-4" 3034', datetime.datetime(2014, 11, 7, 0, 0), u'BLDG HAD EXISTING SEWER INTO PROPERTY AND WAS EXTENDED TO NEW BLDG PAD FROM PREVIOUS BLDG LOCATION.\r\nSEE BACK OF CARD FOR DRAWING', u'/gis/utilities/static/uploads/tap/1259.pdf')

  File "C:\\www\\flask_app\\virtualenv\\lib\\site-packages\sqlalchemy\processors.py", line 85, in process
    return decoder(value, errors)[0]
  File "C:\Python27\ArcGISx6410.4\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
TypeError: must be string or buffer, not datetime.datetime

以下是相关的orm模型:

from app import db

class Base_Track_User(db.Model):
    """
    A base class with additional fields that track which user added and updates each instance
    """
    __table_args__ = {'schema':DEFAULT_SCHEMA}
    __abstract__  = True

    id = db.Column(db.Integer, primary_key=True,
        info={'widget': HiddenInput()}
    )
    date_created  = db.Column(db.DateTime,  default=db.func.current_timestamp())
    date_modified = db.Column(db.DateTime,  default=db.func.current_timestamp(),
                                           onupdate=db.func.current_timestamp())
    created_by = db.Column(db.String(255), default=get_user_id)
    modified_by = db.Column(db.String(255), default=get_user_id, onupdate=get_user_id)

class Tap_Record(Base_Track_User):
    """
    the tap card model with all the information regarding
    each properties water and sewer lines
    """
    __tablename__ = 'util_tap'
    __table_args__ = {
        'schema': 'dbo',
    }

    id = db.Column(db.Integer, primary_key=True)
    parcelid = db.Column(db.String(255))
    status = db.Column(db.String(255))
    street_add = db.Column(db.String(255))
    prop_desc = db.Column(db.String(255))
    service_num = db.Column(db.Integer)
    meter_desc = db.Column(db.String(255))
    corp_desc = db.Column(db.String(255))
    curb_stop = db.Column(db.String(255))
    water_material = db.Column(db.String(255))
    water_date = db.Column(db.String(255))
    laid_by = db.Column(db.String(255))
    re_laid_by = db.Column(db.String(255))
    san_service = db.Column(db.String(255))
    san_laid = db.Column(db.String(255))
    san_material = db.Column(db.String(255))
    san_date = db.Column(db.DateTime)
    remarks = db.Column(db.Text())
    file_url = db.Column(db.Text())

这是我的数据库架构:

db schema

1 个答案:

答案 0 :(得分:0)

嗯,事实证明这是显而易见的......我在python模型中设置了一个String类型的列,但在sql server中,它被设置为键入datetime,这导致了问题。

相关问题