【问题标题】:Load Data Local Infile with SQLAlchemy and pymysql使用 SQLAlchemy 和 pymysql 加载数据本地 Infile
【发布时间】:2023-03-09 17:32:01
【问题描述】:

我正在尝试使用 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 上

请帮忙。

【问题讨论】:

  • 尝试用text 包裹你的sql 对象并写下发生了什么
  • 您的文件大吗?有一个issue 指出它可能不适用于大文件
  • 文件少于 12,000 行。
  • 您的文件路径是否正确?尝试将其放在MySQL 可以访问的某个目录中,例如/var/
  • @AzatIbrakov 这是您建议的“文本”。这样可行。谢谢。我该如何回答?我现在有另一个问题(当然),但这似乎已经解决了。

标签: python sqlalchemy pymysql


【解决方案1】:

你必须用"""确保你的长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')
"""

【讨论】:

  • 谢谢。我更改了代码并收到完全相同的错误。我相信这与“本地”的名称有关。
【解决方案2】:

这里的问题是用 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 的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2012-10-26
    • 2015-12-20
    • 2011-11-02
    相关资源
    最近更新 更多