首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL终端中工作的查询在通过PyMySQL执行时失败。

问在MySQL终端中工作的查询在通过PyMySQL执行时失败。
EN

Stack Overflow用户
提问于 2016-10-06 21:33:24
回答 1查看 383关注 0票数 0

我在下面提供了三个示例SQL查询。这些操作都很好,直接从MySQL [db] >环境中的终端执行时返回预期的表输出。

这些查询彼此保存在一个名为queries.py的python中。第二个查询在通过pymysql传递到db时运行良好,但第一个查询返回一个空数组。

我查看了这个职位、这个职位和这个职位,他们似乎都没有解决这个问题。

下面是我用Python (版本3.5)测试的示例代码:

代码语言:javascript
复制
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的样子。每个查询在MySQL中执行时都返回预期的输出,但第一个查询VETTED通过pymysql传递给DB时返回一个空白数组:

代码语言:javascript
复制
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`;"""
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-06 21:59:46

我认为您需要在Python文字中使用四个反斜杠来表示MySQL所需的两个反斜杠字符,以表示反斜杠字符。

MySQL需要字符串文本中的两个反斜杠来表示反斜杠字符。您的SQL文本在MySQL中工作,因为字符串文本包含两个反斜杠字符。

但是在Python代码中,发送给MySQL的SQL语句只包含单个反斜杠字符。

这是因为Python还需要字符串文本中的两个反斜杠来表示反斜杠字符,就像MySQL所做的那样。

所以在Python里..。

代码语言:javascript
复制
  """CRM\\Bundle"""
        ^^

表示只包含一个反斜杠字符的字符串:'CRM\Bundle'

若要获得包含两个反斜杠字符的字符串:'CRM\\Bundle'

您需要Python文字中的四个反斜杠,如下所示:

代码语言:javascript
复制
  """CRM\\\\Bundle"""
        ^^^^
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39905956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档