Python Pandas忽略函数中的dtype以_sql,给出TypeError:应为string或bytes对象

Python Pandas忽略函数中的dtype以_sql,给出TypeError:应为string或bytes对象,python,pandas,sqlalchemy,Python,Pandas,Sqlalchemy,我正在处理Excel电子表格中的数据并将其上载到Oracle。Pandas在命令上失败,无法使用特定的边缘大小写来创建sql。我有一个特定的列注释,它通常包含字符串,但是在一行中用户键入了一个数字(即500) 我使用dtype参数强制将其读取为数字,因此我希望该数字作为VARCHAR上传到Oracle表: dataWrite.to_sql(name = 'FB_DATA_HOURLY', schema = 'schemaName', index = False, con = conWrite,

我正在处理Excel电子表格中的数据并将其上载到Oracle。Pandas在命令上失败,无法使用特定的边缘大小写来创建sql。我有一个特定的列注释,它通常包含字符串,但是在一行中用户键入了一个数字(即500)

我使用dtype参数强制将其读取为数字,因此我希望该数字作为VARCHAR上传到Oracle表:

dataWrite.to_sql(name = 'FB_DATA_HOURLY', schema = 'schemaName', index = False, con = conWrite, if_exists='append', dtype={'COMMENTS': VARCHAR(length=200)})
但是,当它试图将这个数字上传到VARCHAR列时,仍然存在一个TypeError

TypeError                                 Traceback (most recent call last)
<ipython-input-99-1864db124148> in readExcel_05142019(version, filepath)
     72     conWrite = oracle_db.connect()
---> 73     dataWrite.to_sql(name = 'FB_DATA_HOURLY', schema = 'schemaName', index = False, con = conWrite, if_exists='append', dtype={'COMMENTS': VARCHAR(length=200)})
     74 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
   2710             chunksize=chunksize,
   2711             dtype=dtype,
-> 2712             method=method,
   2713         )
   2714 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
    516         chunksize=chunksize,
    517         dtype=dtype,
--> 518         method=method,
    519     )
    520 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method)
   1318         )
   1319         table.create()
-> 1320         table.insert(chunksize, method=method)
   1321         if not name.isdigit() and not name.islower():
   1322             # check for potentially case sensitivity issues (GH7815)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py in insert(self, chunksize, method)
    754 
    755                 chunk_iter = zip(*[arr[start_i:end_i] for arr in data_list])
--> 756                 exec_insert(conn, keys, chunk_iter)
    757 
    758     def _query_iterator(

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py in _execute_insert(self, conn, keys, data_iter)
    668         """
    669         data = [dict(zip(keys, row)) for row in data_iter]
--> 670         conn.execute(self.table.insert(), data)
    671 
    672     def _execute_insert_multi(self, conn, keys, data_iter):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\engine\base.py in execute(self, object_, *multiparams, **params)
    980             raise exc.ObjectNotExecutableError(object_)
    981         else:
--> 982             return meth(self, multiparams, params)
    983 
    984     def _execute_function(self, func, multiparams, params):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\sql\elements.py in _execute_on_connection(self, connection, multiparams, params)
    285     def _execute_on_connection(self, connection, multiparams, params):
    286         if self.supports_execution:
--> 287             return connection._execute_clauseelement(self, multiparams, params)
    288         else:
    289             raise exc.ObjectNotExecutableError(self)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _execute_clauseelement(self, elem, multiparams, params)
   1099             distilled_params,
   1100             compiled_sql,
-> 1101             distilled_params,
   1102         )
   1103         if self._has_events or self.engine._has_events:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1248         except BaseException as e:
   1249             self._handle_dbapi_exception(
-> 1250                 e, statement, parameters, cursor, context
   1251             )
   1252 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
   1476                 util.raise_from_cause(sqlalchemy_exception, exc_info)
   1477             else:
-> 1478                 util.reraise(*exc_info)
   1479 
   1480         finally:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\util\compat.py in reraise(tp, value, tb, cause)
    151         if value.__traceback__ is not tb:
    152             raise value.with_traceback(tb)
--> 153         raise value
    154 
    155     def u(s):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1224                 if not evt_handled:
   1225                     self.dialect.do_executemany(
-> 1226                         cursor, statement, parameters, context
   1227                     )
   1228             elif not parameters and context.no_parameters:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sqlalchemy\dialects\oracle\cx_oracle.py in do_executemany(self, cursor, statement, parameters, context)
   1126         if isinstance(parameters, tuple):
   1127             parameters = list(parameters)
-> 1128         cursor.executemany(statement, parameters)
   1129 
   1130     def do_begin_twophase(self, connection, xid):

TypeError: expecting string or bytes object
TypeError回溯(最近一次调用)
在readExcel_05142019中(版本,文件路径)
72 conWrite=oracle_db.connect()
--->73 dataWrite.to_sql(name='FB_DATA_HOURLY',schema='schemaName',index=False,con=conWrite,如果存在='append',dtype={'COMMENTS':VARCHAR(length=200)})
74
~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\generic.py in to_sql(self、name、con、schema、如果_存在、索引、索引标签、chunksize、数据类型、方法)
2710 chunksize=chunksize,
2711数据类型=数据类型,
->2712方法=方法,
2713         )
2714
~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\io\sql.py in to_sql(框架、名称、con、模式,如果存在,索引、索引标签、chunksize、数据类型、方法)
516 chunksize=chunksize,
517数据类型=数据类型,
-->518方法=方法,
519     )
520
~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\io\sql.py in to_sql(self、frame、name、if_存在、index、index_标签、schema、chunksize、dtype、method)
1318         )
1319 table.create()
->1320表.插入(chunksize,method=method)
1321如果不是name.isdigit()而不是name.islower():
1322#检查潜在的案例敏感性问题(GH7815)
插入中的~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\io\sql.py(self、chunksize、method)
754
755 chunk\u iter=zip(*[arr[start\u i:end\u i]用于数据列表中的arr])
-->756执行插入(连接、键、块)
757
758定义查询迭代器(
~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\io\sql.py in\u execute\u insert(self、conn、key、data\u iter)
668         """
669数据=[dict(zip(键,行))表示数据表中的行]
-->670 conn.execute(self.table.insert(),数据)
671
672定义执行插入多(自身、连接、键、数据):
执行中的~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\engine\base.py(self、object、*multipams、**params)
980 raise exc.OBJECTNOTEXECUTABLE错误(对象)
981其他:
-->982返回方法(自身、多RAM、参数)
983
984定义执行函数(self、func、multiparams、params):
连接(self、connection、multipams、params)中的~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\sql\elements.py
285定义在连接上执行(自、连接、多内存、参数):
286如果self.u支持执行:
-->287返回连接。_执行_子句元素(self、multiparams、params)
288其他:
289 raise exc.ObjectNoteExecutableError(自身)
~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\engine\base.py in\u execute\u clauseelement(self、elem、multiparams、params)
1099个参数,
1100编译的sql,
->1101个参数,
1102         )
1103如果self.\u有\u事件或self.engine.\u有\u事件:
执行上下文中的~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\engine\base.py(self、方言、构造函数、语句、参数、*args)
1248除e以外的基本例外情况:
1249 self.\u handle\u dbapi\u异常(
->1250 e,语句,参数,游标,上下文
1251             )
1252
~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\engine\base.py in\u handle\u dbapi\u异常(self、e、语句、参数、游标、上下文)
1476 util.raise_from_cause(sqlalchemy_异常,exc_信息)
1477其他:
->1478用途重新发布(*exc_信息)
1479
1480最后:
~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\util\compat.py重新启动(tp、值、tb、原因)
151如果值.\uuuu回溯\uuuuuu不是tb:
152提升值。带回溯(tb)
-->153提高价值
154
155 def u(s):
执行上下文中的~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\engine\base.py(self、方言、构造函数、语句、参数、*args)
1224如果未处理evt_:
1225 self.dialogue.do_executemany(
->1226游标、语句、参数、上下文
1227                     )
1228 elif not参数和context.no_参数:
dou executemany中的~\AppData\Local\Continuum\anaconda3\lib\site packages\sqlalchemy\dialogs\oracle\cx\u oracle.py(self、游标、语句、参数、上下文)
1126如果isinstance(参数、元组):
1127参数=列表(参数)
->1128 cursor.executemany(语句、参数)
1129
1130 def双相(自、连接、xid):
TypeError:应为字符串或字节对象

我可以通过将列类型从Object转换为String来解决这个问题,同时确保将null值保留为null,而不是字符串“nan”

# convert any string values that are purely numeric to be strings, while preserving nulls
dataWrite['COMMENTS'] = dataWrite['COMMENTS'].where(dataWrite['COMMENTS'].isnull(), dataWrite['COMMENTS'].astype(str))