2016-10-06 15 views
-1

以下に3つのサンプルSQLクエリを示します。これらのそれぞれはうまく動作し、MySQL [db] >環境の端末から直接実行されたときに期待されるテーブル出力を返します。PyMySQL経由でMySQL端末で動作するクエリが失敗する

これらのクエリはそれぞれ、queries.pyというPythonのドキュメントに保存されています。 2番目の2つのクエリは、pymysql経由でdbに渡されたときに正常に動作しますが、最初のクエリは空の配列を返します。

私はthis postthis post、およびthis postをチェックアウトしましたが、そのいずれも問題を解決していないようです。

import pymysql 
import params 
import queries 

conn = pymysql.connect(
    host = params.HOST, 
    user = params.USER, 
    password = params.PWD, 
    db = 'db', 
    charset='utf8', 
    cursorclass=pymysql.cursors.DictCursor, 
    autocommit = True) 

test_queries = [queries.VETTED, queries.CREATED, queries.CLOSED_OPPS] 
with conn.cursor() as cursor: 
    for query in test_queries: 
     cursor.execute(query) 
     print(cursor.fetchall()) 

() #..blank output -- doesn't make sense because corresponding query works in MySQL env 
[...] #..expected output from query 2 
[...] #..expected output from query 3 

はここqueries.pyは次のようになります。

は、ここで私はPythonでテストするために使用しているサンプルコード(バージョン3.5)です。 pymysqlを経由してDBに渡されたときのMySQL内で実行されたときに出力を期待これらのクエリが戻るが、最初の1、VETTED、それぞれが空白の配列を返します。

VETTED = """ 
SELECT 
    date_format(oa.logged_at, '%Y-%m-%d') as `action_date`, 
    count(1) `count` 
FROM 
    crm_audit_field oaf, 
    crm_audit oa, 
    crm_sales_lead lead 
WHERE 
    oa.id = oaf.audit_id AND 
    oaf.field = 'status' AND 
    (
    oaf.new_text = 'Qualified' OR 
    oaf.new_text = 'Disqualified' OR 
    oaf.new_text = 'Canceled' 
) AND 
    oa.object_class = 'CRM\\Bundle\\SalesBundle\\Entity\\Lead' AND 
    lead.id = oa.object_id AND 
    (lead.status_id = 'qualified' OR lead.status_id = 'canceled') 
GROUP BY 
    `action_date`;""" 

CREATED = """ 
SELECT 
    DATE_FORMAT(lead.createdat, '%Y-%m-%d') as `creation_date`, 
    count(1) 
FROM 
    crm_sales_lead `lead` 
GROUP BY 
    creation_date;""" 

CLOSED_OPPS = """ 
SELECT 
    date_format(closed_at, '%Y-%m-%d') `close_date`, 
    count(1) `count` 
FROM 
    crm_sales_opportunity 
WHERE 
    status_id = 'won' 
GROUP BY 
    `close_date`;""" 
+1

興味深い...あなたは正しく引用符を使用しているように思える、私の謙虚な提案はトップあなたのwhere句を簡素化し、徐々に条件を追加されます:210あなたは、このようなリテラルPythonでバックスラッシュを、必要があるでしょう。 –

+1

Pythonは文字列リテラルのバックスラッシュ文字の一部を噛み砕いています。 Pythonの文字列リテラルでバックスラッシュを二重にする必要があります。合計で* 4つのバックスラッシュがあり、MySQLに渡すSQLテキストに* 2つのバックスラッシュを付けるため、MySQLはバックスラッシュ文字を* 1として見ます。 – spencer7593

答えて

1

私はあなたがPythonの文字列ののバックスラッシュが必要だと思いますバックスラッシュ文字を表すために、2つのバックスラッシュ文字をMySQLで必要とすることを表します。

MySQLには、の文字列リテラルに2つのバックスラッシュが必要です。文字列リテラルにの2つの円記号が含まれているため、MySQLで使用しているSQLテキストが機能します。

しかし、Pythonコードでは、MySQLに送信されるSQL文にはという単一のの円記号しか含まれていません。

これはPythonでもの2つの文字列リテラルに二重引用符()が必要で、MySQLと同じようにバックスラッシュ文字を表します。 'CRM\\Bundle''CRM\Bundle'

がバックスラッシュ文字を含む文字列を取得するには:

ので、Pythonで...

"""CRM\\Bundle""" 
     ^^ 

はバックスラッシュ文字を含む文字列を表し、

"""CRM\\\\Bundle""" 
     ^^^^ 
+0

それを釘付け、それはまさに問題でした。これまで他のアプリでこれを見てきました。ありがとう! – Aaron

関連する問題