Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-mysql查询不工作_Python_Mysql_Mysql Python - Fatal编程技术网

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,

我尝试使用以下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, @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似乎需要为
管道名称添加引号