使用 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')
""")
这在这种情况下很有帮助。
推荐阅读 SQLAlchemy
的 SQL 表达式语言教程的 Using Textual SQL 部分。
也可以在 question 找到对 text
的引用。
我正在尝试使用 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 = 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')
""")
这在这种情况下很有帮助。
推荐阅读 SQLAlchemy
的 SQL 表达式语言教程的 Using Textual SQL 部分。
也可以在 question 找到对 text
的引用。