python-mysql查询不工作
我尝试使用以下Python脚本将数据加载到MySQL表中:python-mysql查询不工作,python,mysql,mysql-python,Python,Mysql,Mysql Python,我尝试使用以下Python脚本将数据加载到MySQL表中: conn = connect_db() cursor = conn.cursor() cursor.execute( "LOAD DATA LOCAL INFILE " + jobsummaryfile + " INTO TABLE daily_job_summary " + "FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' (@col1, @col2, @col3,
conn = connect_db()
cursor = conn.cursor()
cursor.execute(
"LOAD DATA LOCAL INFILE " + jobsummaryfile + " INTO TABLE daily_job_summary " +
"FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4) " +
"set jobname=@col1, queue=@col2, maphours=@col3, reducehours=@col4, date=" + date +
", pipeline=" + pipeline_name + ", grid=" + grid
)
我得到以下错误:
_mysql_exceptions.OperationalError: (1054, "Unknown column 'galaxy' in 'field list'")
我知道在传递查询时这是一个引号问题,但我很难找到答案。有人能告诉我哪里出错了吗
这是我要执行的查询:
LOAD DATA LOCAL INFILE 'file.tsv'
INTO TABLE daily_job_summary
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4)
set jobname=@col1, queue=@col2, maphours=@col3, reducehours=@col4,
date=2014-01-05, pipeline='abcd', grid='AB'
这是我的表格结构:
| id | int(11) | NO | PRI | NULL | auto_increment |
| date | date | YES | | NULL | |
| pipeline | varchar(12) | YES | | NULL | |
| grid | varchar(2) | YES | | NULL | |
| jobname | varchar(255) | YES | | NULL | |
| maphours | int(11) | YES | | NULL | |
| reducehours | int(11) | YES | | NULL | |
| queue | varchar(60) | YES | | NULL | |
似乎您需要为
管道名称
和网格
cursor.execute(" ... pipeline='"+pipeline_name+"', grid='"+grid+"'")
如果打印出构造的MySQL语句,您将看到在某些赋值中,字符串值周围没有所需的单引号 您需要在每个值周围添加单引号,此外,还需要将字符串值中的任何单引号加倍(即,
galaxy
应成为'galaxy'
,但Joe's galaxy
应成为'Joe's galaxy'
)
您可以使用以下功能:
def qstr(in_string, quote_char="'"):
return quote_char + in_string.replace(quote_char, quote_char*2) + quote_char
然后像这样修改代码:
“pipeline=“+qstr(pipeline_name)
如果您使用参数而不是所有字符串连接,MySQLdb将为您处理引用问题。最简单的方法是:
cursor.execute("SELECT * FROM tbl WHERE col1 = %s;", ('foo',))
%s
用作参数的占位符,参数按顺序插入;必须为查询字符串中的每个占位符提供参数。或者,可以将命名参数与字典映射一起使用:
cursor.execute("SELECT * FROM tbl WHERE col1 = %(col1)s;", {'col1': 'foo'})
以这种方式替换语句的某些部分是有限制的(请参阅MySQLdb用户指南中的内容):
参数占位符只能用于插入列值。它们可以不用于SQL的其他部分,如表名、语句等
因此,在查询中,可以将date
、pipeline\u name
和grid
作为参数传递,但不能传递jobsummaryfile
,因为它是文件路径,而不是列值。您还可以使用使所有内容更具可读性,并通过删除不必要的用户变量简化语句:
query = ("LOAD DATA LOCAL INFILE " + jobsummaryfile + " INTO TABLE daily_job_summary "
"FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' "
"(jobname, queue, maphours, reducehours) "
"set date=%s, pipeline=%s, grid=%s;")
curs.execute(query, (date, pipeline_name, grid))
您需要(@col1、@col2、@col3、@col4)
的唯一原因是您需要在将输入文件的所有四列插入表之前操作它们。例如,如果您想确保您的职务名称始终为大写,您可以这样做:
LOAD DATA LOCAL INFILE 'file.tsv'
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(@col1, queue, maphours, reducehours)
SET jobname=UPPER(@col1), date='2014-01-05', pipeline='abcd', grid='AB';
但由于您所做的只是按原样插入数据,所有这些用户变量只会使查询变得更长、更难读取;把他们排除在外
就我个人而言,我喜欢在SQL语句中使用Python的多行字符串。这让我可以做两件事:首先,为了测试目的,我可以快速地将整个语句复制/粘贴到Workbench中;第二,我可以从一条注释开始,这将帮助我在检查服务器管理选项卡时识别当前正在运行的查询。缺点是它有点冗长,特别是在插入诸如表名之类的内容时 例如:
load_from_file = """--load from {file}
LOAD DATA LOCAL INFILE {file}
INTO TABLE daily_job_summary
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(jobname, queue, maphours, reducehours)
SET date=%s, pipeline=%s, grid=%s;
"""
curs.execute(query=load_from_file.format(file=jobsummaryfile),
args=(date, pipeline_name, grid))
您必须显示游标中发送的查询字符串。execute()命令、示例文件以及表架构。编辑了问题@Ivancachicatarian,表中的“galaxy”列在哪里?galaxy是管道名称…@furasIt似乎需要为
管道名称添加引号