SQLAlchemy:执行简单的SQL语句

目录

虽然 SQLAlchemy 是 ORM 框架,但也可以用来执行 SQL 语句。

本文介绍如何使用 SQLAlchemy 执行简单的 SQL 语句。

示例代码来自正在开发的项目,从单位的台风数据库中检索数据,计划用于 CMA-PI 上的业务系统。

安装

目标数据库支持 MySQL 客户端,所以需要使用 MySQL 的链接库。

CMA-PI 上的 Python 环境没有安装 MySQL 库,所以笔者使用用户目录下的 Anaconda 环境,并使用 conda 安装 SQLAlchemy 和 pymysql。

创建连接

创建数据库连接

from sqlalchemy import create_engine

engine = create_engine(
    'mysql+pymysql://'
    f'{user}:{password}'
    f'@{host}/{database_name}', 
)
conn = engine.connect()

执行查询

构造带参数的查询 SQL 语句

from sqlalchemy.sql import text
s = text(
    "SELECT * "
    f"FROM {table_name} "
    "WHERE datetime=:start_time AND fcsthour=:forecast_hour"
)

start_time 是起报时间,forecast_hour 是预报时次。

执行 SQL 语句,设置参数值

query = conn.execute(
    s,
    start_time=start_time.to_pydatetime(),
    forecast_hour=forecast_hour
)

处理结果

获取所有结果,返回元素为 tuple 的列表

result = query.fetchall()

如果知道返回的列名,或者在 SELECT 语句中指定具体的列名,可以很方便由返回结果构造 pandas.DataFrame 对象。

df = pd.DataFrame(
    result,
    columns=columns,
)

将查询结果保存到 csv 中,不保存 index

df.to_csv(
    output_file,
    index=False,
)

讨论

如果想要得到固定的结果,最好在 SELECT 语句中指定列名,这样返回结果的列内容和顺序是固定的。 方便使用 Fortran 、C++ 等未内置 CSV 处理库的编程语言解析。

参考

Using Textual SQL