Python pandas.DataFrame.to_sql用法

本文介绍了Python pandas.DataFrame的to_sql方法,用于将DataFrame数据写入SQL数据库。支持多种数据库,如SQLite,并详细说明了参数用法,包括表名、连接、处理已存在表的方式等。还给出了创建数据库连接、检查表是否存在以及保存数据的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用法:

DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)

将存储在DataFrame 中的记录写入 SQL 数据库。

支持 SQLAlchemy [1] 支持的数据库。可以新创建、附加或覆盖表。

参数

  • namestr

        SQL 表的名称。

  • consqlalchemy.engine(引擎或连接)或 sqlite3.Connection

        使用 SQLAlchemy 可以使用该库支持的任何数据库。为 sqlite3.Connection 对象提供了旧版支持。用户负责 SQLAlchemy 可连接的引擎处理和连接关闭,请参阅这里

  • schemastr,可选

        指定架构(如果数据库风格支持此)。如果没有,使用默认模式。

  • if_exists{‘fail’, ‘replace’, ‘append’},默认 ‘fail’

        如果表已经存在,如何表现。

        fail:引发ValueError

        replace:在插入新值之前删除表。

        append:向现有表中插入新值。

  • index布尔值,默认为真

        将DataFrame 索引写为一列。使用index_label 作为表中的列名。

  • index_labelstr 或序列,默认无

        索引列的列标签。如果给出 None(默认)并且 index 为 True,则使用索引名称。如果DataFrame 使用MultiIndex,则应给出一个序列

  • chunksizeint 可选

        指定每次要写入的每批中的行数。默认情况下,将一次写入所有行。

  • dtypedict或标量,可选

        指定列的数据类型。如果使用字典,键应该是列名,值应该是 SQLAlchemy 类型或 sqlite3 旧模式的字符串。如果提供了标量,它将应用于所有列。

  • method{无,‘multi’,可调用},可选

        控制使用的 SQL 插入子句:

         无:使用标准 SQL INSERT 子句(每行一个)。

        ‘multi’:在单个 INSERT 子句中传递多个值。

        可使用签名 (pd_table, conn, keys, data_iter) 调用。

详细信息和示例可调用实现可以在部分插入方法中找到。

  • 返回

        无或int

        受to_sql 影响的行数。如果传递给method 的可调用对象不返回行数,则返回无。

        受影响的返回行数是 sqlite3.Cursor 或 SQLAlchemy 可连接的 rowcount 属性的总和,这可能无法反映 sqlite3 或 SQLAlchemy 中规定的写入行的确切数量。

  • 抛出

        ValueError

        当表已存在且if_exists 为‘fail’(默认值)时。

  • 注意

如果数据库支持,时区感知日期时间列将使用 SQLAlchemy 编写为 Timestamp with timezone 类型。否则,日期时间将存储为原始时区本地的时区未知时间戳。

  • 参考

pandas.DataFrame.to_sql

https://docs.sqlalchemy.org


例子

创建数据库连接引擎

import sqlalchemy

def create_mysql_engine():
    """
    创建数据库引擎对象
    :return: 新创建的数据库引擎对象
    """
    # 引擎参数信息
    host = 'localhost'
    user = 'root'
    passwd = 'root'
    port = '3306'
    db = 'stock'

    # 创建连接数据库stock的引擎对象
    db_engine = sqlalchemy.create_engine(
        'mysql+pymysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(user, passwd, host, port, db),
        poolclass=sqlalchemy.pool.NullPool
    )

    # 如果不存在数据库stock则创建
    db_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(db))

    # 返回引擎对象
    return db_engine

查询是否存在表

def table_exists(engine, table_name):  # 这个函数用来判断表是否存在
    with engine.connect() as con:
        sql = "show tables;"
        tables = con.execute(sql).fetchall() # 读取show tables;执行后的全部表名
        for table_col in tables:
            if table_name == table_col[0]:
                return True
        return False

获取股票列表并保存

from sql_connect import create_mysql_engine, table_exists
import tushare as ts

#Tushare初始化
ts.set_token('******************')
tspro = ts.pro_api()

def get_AllStock(update=False):
    '''
    获得所有股票列表并保存数据库中
    :param update: 2022年7月14日
    :return: 股票列表
    '''
    #创建数据库引擎
    engine = create_mysql_engine()

    if update or table_exists(engine,'allstock_tu')==False:
        #若要求数据更新或无数据则开始下载数据并保存

        # 查询当前所有正常上市交易的股票列表
        data = tspro.stock_basic(exchange='', fields='ts_code,symbol,name,exchange,industry,list_date')
        data.to_sql(name='allstock_tu', con=engine, if_exists='replace', index=False)
        print('所有股票代码 Tu_stock保存成功')
        return data
    else:
        #直接从数据库中读取allstock_tu
        print('读取数据库allstock_tu')
        sql_cmd = 'SELECT * FROM allstock_tu'
        data = pd.read_sql(sql=sql_cmd, con=engine)
        return data

ps:关于Tushare的使用在其他文章中讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林不更新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值