pandas中的to_sql的使用

Posted 不会掉头发的小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas中的to_sql的使用相关的知识,希望对你有一定的参考价值。

1.to_sql的作用:

to_sql是pandas中的DataFrame数据类型提供的一个API,可以将整个DF导入数据库中,其中有几个参数的作用为:

  • name: 数据库中的表名
  • con: 与read_sql中相同,数据库连接的驱动
  • if_exits: 当数据库中的这个表存在的时候,采取的措施是什么,包括三个值,默认为fail
    • fail,若表存在,则不进行数据表写入的相关操作
    • replace:若表存在,将数据库表中的数据覆盖;
    • append:若表存在,将数据写到原表的后面。
  • index:是否将df的index单独写到一列中
  • index_label:指定列作为df的index输出,此时index为True
  • dtype: 指定列的输出到数据库中的数据类型。字典形式储存:column_name: sql_dtype

2.to_sql的使用实例

完成数据库的连接驱动
conn=create_engine(‘mysql+pymysql://:@:/’.format(user1,password1,host1,port1,database1))
以上涉及到的变量自己定义即可,分别是:数据库的用户名、密码、主机、端口以及数据库名称

df1.to_sql('tech_res', con=conn,index = False , if_exists = 'append', chunksize = None,dtype=dtypedict)

3.出现的问题记录

  • 出现1241的错误:
    出现这个错误可能是DF数据中包含列表类型的数据,此时要对数据进行强制转换。使用下面的语法进行
    df1.loc[:,'keyAndAbs_'] = df1['keyAndAbs_'].astype(str)

以上就是我在使用to_sql过程中,遇到的一些问题,特此记录,方便日后查阅。

pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序

【中文标题】pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序【英文标题】:pandas.DataFrame.to_sql - column order of source csv file and destination table 【发布时间】:2022-01-24 03:20:55 【问题描述】:

在 Azure Databricks 内的笔记本中,我使用 pandas.DataFrame.to_sql 将数据从 CSV 文件加载到 Azure SQL 数据库表。 CSV 文件和 SQL 表中的列顺序完全相同。但他们的名字不同。

问题pandas.DataFrame.to_sql 是否仍会将数据正确加载到相应的列?例如,如果 CSV 文件具有列 F_NameL_NameAgeGender - 并且 SQL 表的列(按相同顺序)为 fnamelnameperson_age、@987654331 @,数据是否仍以相同的顺序加载(即CSV文件中的名字列值将转到sql表的第一个名称列,CSV文件的姓氏列值将转到sql表的姓氏列等...)。

备注:csv文件大约有150列,SQL表的列数完全相同。 csv 文件定期从外部源加载,具有相同数量的列以完全相同的顺序,但列名有时非常轻微 column1coluumn_1, .... 等等。所以我们无法控制在他们的列名上(尽管顺序总是相同的名字,姓氏,年龄,......)

代码 sn-p

import pandas as pd
import sqlalchemy as sq
.............

pandasDFrame = pd.read_csv('/dbfs/FileStore/tables/MyFile.csv', header='infer')

pandasDFrame .to_sql(name='MySQLTable', con=engine, if_exists='replace', method='multi', chunksize=1000, index=False,\
dtype='fname': sq.VARCHAR(15),\
     'lname': sq.VARCHAR(15),\                                                                                      
     `person_age`: sq.varchar(3),\
     `sex` : sq.varchar(10))

【问题讨论】:

我想是的,是的。 列名必须匹配源和目标。事实上,你可以自己测试它。你的代码会发生什么? 【参考方案1】:

考虑在将数据框附加到表之前检索目标表列并将其分配给您的数据框:

with engine.begin() as conn:
    result = conn.execute("SELECT TOP 0 * FROM MySQLTable")
    cols = [col for col in result.keys()]

pandasDFrame.columns = cols

pandasDFrame.to_sql(
    name = 'MySQLTable', 
    con = engine, 
    if_exists = 'replace', 
    method = 'multi', 
    chunksize = 1000, 
    index = False,
    dtype = 
        'fname': sq.VARCHAR(15),
        'lname': sq.VARCHAR(15),
        'person_age': sq.varchar(3),
        'sex': sq.varchar(10)
    
)

【讨论】:

以上是关于pandas中的to_sql的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 SqlAlchemy 和 cx_Oracle 将 Pandas DataFrame 写入 Oracle 数据库时加快 to_sql()

在 pandas.to_sql() 中使用“可调用”方法的示例?

pandas to_sql if_exist参数指南

使用 Pandas .to_sql 将 JSON 列写入 Postgres

为啥 dask 的“to_sql”比 pandas 花费更多时间?

pandas to_sql 中的“意外关键字参数 'fetch'”错误的来源?