使用 SQLAlchemy 和 pymysql 加载数据本地 Infile

Load Data Local Infile with SQLAlchemy and pymysql

我正在尝试使用 LOAD DATA LOCAL INFILE,但我继续得到:

sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1") [SQL: "LOAD DATA LOCAL INFILE 'file.csv' "]

SQL 代码在 Workbench 中工作(并且它是我在 VBA 中使用的预先存在的代码)。另请注意,我在创建引擎时指定了 local_infile=1。

代码如下:

import pymysql as mysql
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

def main():
    engine=create_engine('mysql+pymysql://user:pwd@localhost:3306/db?charset=utf8&local_infile=1')
    SessionMaker = sessionmaker(bind=engine)
    session = SessionMaker()
    sql = "LOAD DATA LOCAL INFILE '/home/file.csv' " 
    "INTO TABLE settles "
    "FIELDS TERMINATED BY ',' "
    "lines terminated by '\n' "
    "IGNORE 1 LINES " 
    "(product_symbol, contract_month, contract_year, contract_day, contract, " 
    "product_desc, open_price, high_price, high_ab_ind, low_price, low_ab_ind, " 
    "last_price, last_ab_ind, settle_price, " 
    "pt_chg, est_volume, prior_settle_price, prior_volume, prior_int, @var1) " 
    "set trade_date = str_to_date(@var1, '%m/%d/%Y');"
    session.execute(sql)
    session.flush()
    engine.dispose()

if __name__ == "__main__":
    main()

这是在 Ubuntu 16.04

请帮忙。

您必须确保您的 sql 长查询是正确的 """:

sql = """
    LOAD DATA LOCAL INFILE '/home/file.csv' 
    INTO TABLE settles
    FIELDS TERMINATED BY ','
    lines terminated by '\n'
    IGNORE 1 LINES 
    (product_symbol, contract_month, contract_year, contract_day, contract,
    product_desc, open_price, high_price, high_ab_ind, low_price, low_ab_ind, 
    last_price, last_ab_ind, settle_price, 
    pt_chg, est_volume, prior_settle_price, prior_volume, prior_int, @var1) 
    set trade_date = str_to_date(@var1, '%m/%d/%Y')
"""

这里的问题是用 text

包装原始 SQL 查询
sql = text("""
    LOAD DATA LOCAL INFILE '/home/file.csv' 
    INTO TABLE settles
    FIELDS TERMINATED BY ','
    lines terminated by '\n'
    IGNORE 1 LINES 
    (product_symbol, contract_month, contract_year, contract_day, contract,
    product_desc, open_price, high_price, high_ab_ind, low_price, low_ab_ind, 
    last_price, last_ab_ind, settle_price, 
    pt_chg, est_volume, prior_settle_price, prior_volume, prior_int, @var1) 
    set trade_date = str_to_date(@var1, '%m/%d/%Y')
""")

这在这种情况下很有帮助。

推荐阅读 SQLAlchemySQL 表达式语言教程的 Using Textual SQL 部分

也可以在 question 找到对 text 的引用。