在pymysql多行语句中格式化

时间:2014-07-04 10:21:45

标签: python sql database string pymysql

以下从数据库中的一列获取公司名称列表,然后迭代地使用MATCH AGAINST将它们与另一列匹配。

代码是:

cur = conn.cursor()
cur.execute("SELECT DISTINCT company FROM opportunities;")
o_companies = cur.fetchall()

results = []
for n in o_companies:
    entry = n[0]
    cur.execute( """
            SELECT DISTINCT lead_id, leads.created_date, leads.company_name,
            opp_id, opportunities.created_date, opportunities.company,
            DATEDIFF(
                    STR_TO_DATE(opportunities.created_date,'%d/%m/%Y'),
                    STR_TO_DATE(leads.created_date,'%d/%m/%Y')
                    ) as difference,
            MATCH(company) AGAINST ({0}) as match_rating
            FROM leads, opportunities WHERE MATCH(company) AGAINST({0}) > 0
            ORDER BY difference, match_rating;
            """.format(entry)
            )
    matches = cur.fetchall()
    for match in matches:
        print(match)
        results.append(match)

有两个问题:

首先它不起作用,我得到的错误信息是:

  

pymysql.err.ProgrammingError:(1064,"你的SQL中有错误   句法;查看与MySQL服务器版本对应的手册   正确的语法使用附近的健康(加拿大))   match_rating \ n \ t \ t FROM lead,Opportunhere WHERE MATCH'在   第7行")

第二个是我的所有新行和制表符都显示出来,我原以为这些会被自动忽略。

SQL语句有问题还是格式化?

编辑:

以下是从第一个SQL语句返回的元组的示例:

('Cuttime.fm',) ('Renault Nissan',) ('Scout Marketing',) ('Beechcraft',) ('mobily',) ('Oliver Wyman',) ('MASTHEAD MARKETING',) ('FSA',) ('Only-apartments',) ('buchan',) ('Ralphs McIntosh',) ('TCMPi
- The Corporate Marketplace, Inc.',) ('University of Maryland, College Park',) ('Burson-Marsteller Guatemala',) ('Randstad Tech',) ('Gulf States Financial Services',) ('Socialyte',) ('The Social Shack',) ('Consumerchoices',) ('London Underground',)

正在使用n[0]访问这些值。

1 个答案:

答案 0 :(得分:2)

您忘记在查询AGAINST ('{0}')

中提供引号

进行测试请打印查询并测试数据库中的语句,以便您debug轻松

声明必须

 """ SELECT DISTINCT lead_id, leads.created_date, leads.company_name,
            opp_id, opportunities.created_date, opportunities.company,
            DATEDIFF(
                    STR_TO_DATE(opportunities.created_date,'%d/%m/%Y'),
                    STR_TO_DATE(leads.created_date,'%d/%m/%Y')
                    ) as difference,
            MATCH(company) AGAINST ('{0}') as match_rating
            FROM leads, opportunities WHERE MATCH(company) AGAINST('{0}') > 0
            ORDER BY difference, match_rating
            """.format(a)