用法:
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] 支持的数据库。可以新创建、附加或覆盖表。
参数:
- name:str
SQL 表的名称。
- con:sqlalchemy.engine(引擎或连接)或 sqlite3.Connection
使用 SQLAlchemy 可以使用该库支持的任何数据库。为 sqlite3.Connection 对象提供了旧版支持。用户负责 SQLAlchemy 可连接的引擎处理和连接关闭,请参阅这里。
- schema:str,可选
指定架构(如果数据库风格支持此)。如果没有,使用默认模式。
- if_exists:{‘fail’, ‘replace’, ‘append’},默认 ‘fail’
如果表已经存在,如何表现。
fail:引发ValueError
replace:在插入新值之前删除表。
append:向现有表中插入新值。
- index:布尔值,默认为真
将DataFrame 索引写为一列。使用index_label
作为表中的列名。
- index_label:str 或序列,默认无
索引列的列标签。如果给出 None(默认)并且 index
为 True,则使用索引名称。如果DataFrame 使用MultiIndex,则应给出一个序列
- chunksize:int 可选
指定每次要写入的每批中的行数。默认情况下,将一次写入所有行。
- dtype:dict或标量,可选
指定列的数据类型。如果使用字典,键应该是列名,值应该是 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:
例子
创建数据库连接引擎
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的使用在其他文章中讲解