以下に3つのサンプルSQLクエリを示します。これらのそれぞれはうまく動作し、MySQL [db] >
環境の端末から直接実行されたときに期待されるテーブル出力を返します。PyMySQL経由でMySQL端末で動作するクエリが失敗する
これらのクエリはそれぞれ、queries.py
というPythonのドキュメントに保存されています。 2番目の2つのクエリは、pymysql
経由でdbに渡されたときに正常に動作しますが、最初のクエリは空の配列を返します。
私はthis post、this 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`;"""
興味深い...あなたは正しく引用符を使用しているように思える、私の謙虚な提案はトップあなたのwhere句を簡素化し、徐々に条件を追加されます:210あなたは、このようなリテラルPythonでバックスラッシュを、必要があるでしょう。 –
Pythonは文字列リテラルのバックスラッシュ文字の一部を噛み砕いています。 Pythonの文字列リテラルでバックスラッシュを二重にする必要があります。合計で* 4つのバックスラッシュがあり、MySQLに渡すSQLテキストに* 2つのバックスラッシュを付けるため、MySQLはバックスラッシュ文字を* 1として見ます。 – spencer7593