【问题标题】:TypeError: cannot concatenate 'str' and 'tuple' objects while using pymysql.cursorsTypeError:使用 pymysql.cursors 时无法连接“str”和“tuple”对象
【发布时间】:2018-07-25 05:13:30
【问题描述】:

我在 python 上工作。我有一个查询,我的数据库上有 3 个表。

  1. 我已连接到一个 db,并从一个 mysql 表中提取了两列 (idnum,clientname) 中的所有行,例如(1234,雷诺兹), (1235,雷诺兹2)

  2. 然后每个 idnum 都有一个单独的表,例如sample_divya_1234;sample_divya_1235,我们需要从每个表中获取所有电子邮件和 lname。 (注:每个idnum有很多email和lname记录)

  3. 步骤 1 中获取的所有客户端名称都存在于另一个表 sample_divya3 中,因此对于每个客户端名称都需要提取 fname,例如(saha,renolds)

  4. 现在必须将 email、lname、fname 全部放入新表 sql_table1

输入表

Sample_divya1:

    +-----+------------+---
    | idnum | clientname | 
    +-------+------------+-
    | 1234  | renold    | 
    | 1235  | renold1    | 
   +-------+------------+

sample_divya_1234:

   +-------------------+----------+
    | email             | lname    |
    +-------------------+----------+
    | abc@yahoo.com     | abcd     |
    | bcd@gmail.com     | bcda     |
    +-------------------+----------+
    **sample_divya_1235**
    +------------------+-----------+
    | email            | lname     |
    +------------------+-----------+
    | xyz@gmail.com    | xyza      |
    | nag@gmail.com    | sai       |
    | hij@gmail.com    | klm       |
    +------------------+-----------+

    sample_divya3:

    +--------+------------+
    | fname  | clientname |
    +--------+------------+
    | saha   | renold     |
    | hasini | renold1      |
    +--------+------------+

PRG:

import pandas as pd
import pymysql
import pymysql.cursors
from sqlalchemy import create_engine
from time import time
import datetime

conn=pymysql.connect(CONNECTDETAILS)
query = "select idnum from sample_divya1"
cursor=conn.cursor()
cursor.execute(query)
data = cursor.fetchall()
cursor.execute("drop table if exists sql_table1")
sql_table = "create table sql_table1(email varchar(128),lname varchar(128),fname varchar(128))"
cursor.execute(sql_table)


for id in data:
    cursor.execute("select A.idnum, B.fname, B.clientname,C.lname,C.email from (select idnum,clientname from sample_divya1)A cross join (select fname,clientname  from sample_divya3 )B where A.clientname=B.clientname cross join (select email, lname from sample_divya_"+id[0]+")C where A.idnum =id")
    data_1=cursor.fetchall()
    conn.commit()
    print data_1
    cursor.executemany("insert into sql_table1 (email,lname,fname) values (?,?,?)",data_1)
    conn.commit()
conn.commit()

需要输出:

+------------------+----------+--------+
| email            | lname    | fname  |
+------------------+----------+--------+
| abc@yahoo.com    | abcd     | saha   |
| bcd@gmail.com    | bcda     | saha   |
| xyz@gmail.com    | xyza     | hasini |
| nag@gmail.com    | sai      | hasini |
| hij@gmail.com    | klm      | hasini |

错误出现在我的查询中突出显示的部分

""" # cursor.execute("select B.fname,C.lname,C.email from (select idnum,clientname from sample_divya1)A cross join (select fname,clientname from sample_divya3)B where A.clientname= B.clientname cross join (select email, lname from sample_divya_"+id[0]+")C where A.idnum = id")"""

在这里,了解了“'where 子句中的未知列'id'” 所以有人可以在这个where子句中提供帮助

【问题讨论】:

  • 我建议创建接受源参数并返回您需要的整个输出的存储过程。

标签: mysql python


【解决方案1】:

for id in data:后面那一行的字符串拼接。 id 是一个数组(即select idnum from sample_divya1 返回的行)。

将您的代码更改为:

for id in data:
    cursor.execute("select A.idnum, B.fname, B.clientname,C.lname,C.email from (select idnum,clientname from sample_divya1)A cross join (select fname,clientname  from sample_divya3 )B where A.clientname=B.clientname cross join (select email, lname from sample_divya_"+id[0]+")C where A.idnum =id")

注意id[0] 而不是id。现在应该包含查询 select idnum from sample_divya1 中所需的 idnum

如果您对此有疑问,请将生成的查询分配给一个变量并在执行之前将其打印出来。用你的眼睛检查它,然后尝试从 MySQL 命令行运行它。

【讨论】:

  • 同样,您需要将id[0] 连接到您拥有where A.idnum =id 的“id”中
【解决方案2】:

一次:

CREATE VIEW sample_divya_all
SELECT *, '1234' AS tablenum FROM sample_divya_1234
UNION ALL
SELECT *, '1235' AS tablenum FROM sample_divya_1235;

如果所有分区表都是Engine=MyISAM,则可以改为使用Engine=Merge 创建一个表。

查询:

SELECT sda.email, sda.lname, sd3.fname
  FROM sample_divya_all sda
  JOIN sample_divya1 sd1 ON sd1.idnum = sda.tablenum
  JOIN sample_divya3 sd3 ON sd3.clientname = sd1.clientname;

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2015-09-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多