熊猫to_sql更改数据库表中的数据类型

时间:2018-11-14 06:53:57

标签: python sql-server pandas

以前有没有人经历过?

我有一个包含“ int”和“ varchar”列的表-报告计划表。

我正在尝试使用python程序将扩展名为“ .xls”的excel文件导入该表。我正在使用pandas to_sql读取1行数据。

导入的数据为1行11列。

导入成功完成,但是在导入之后,我注意到原始表中的数据类型现已更改为:

        int --> bigint
        char(1) --> varchar(max)
        varchar(30) --> varchar(max)

有什么办法可以防止这种情况吗?数据类型的切换引起了下调例程的问题。

   df = pd.read_excel(schedule_file,sheet_name='Schedule')
   params = urllib.parse.quote_plus(r'DRIVER={SQL Server};SERVER=<<IP>>;DATABASE=<<DB>>;UID=<<UDI>>;PWD=<<PWD>>')
   conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params)
   engine = create_engine(conn_str)

   table_name='REPORT_SCHEDULE'
   df.to_sql(name=table_name,con=engine, if_exists='replace',index=False)

TIA

1 个答案:

答案 0 :(得分:0)

考虑使用pandas.DataFrame.to_sql dtype 参数,在该参数中将SQLAlchemy types的字典传递给命名列:

import sqlalchemy 
...
data.to_sql(name=table_name, con=engine, if_exists='replace', index=False,
            dtype={'name_of_datefld': sqlalchemy.DateTime(), 
                   'name_of_intfld': sqlalchemy.types.INTEGER(),
                   'name_of_strfld': sqlalchemy.types.VARCHAR(length=30),
                   'name_of_floatfld': sqlalchemy.types.Float(precision=3, asdecimal=True),
                   'name_of_booleanfld': sqlalchemy.types.Boolean}