TypeError:使用pymysql.cursors时无法连接'str'和'tuple'对象

时间:2018-07-25 05:13:31

标签: mysql python

我使用python。我有一个查询,我的数据库上有3个表。

  1. 我已经连接到数据库并从mysql表中拉出了两列(idnum,clientname)的所有行,例如(1234,renolds),(1235,renolds2)

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

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

  4. 现在,电子邮件,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 |

Mistake在查询中突出显示的部分

“”“#cursor.execute(”选择B.fname,C.lname,C.email(从sample_divya1选择idnum,clientname)A交叉连接(从sample_divya3选择fname,clientname)B其中A.clientname = B.clientname交叉连接(从sample_divya _“ + id [0] +”中选择电子邮件,lname)C 其中A.idnum = id“ )”“”

在这里前进,就知道““'where子句中的未知列'id'”” 有人可以帮忙这个where子句

2 个答案:

答案 0 :(得分: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。现在,它应包含查询idnum中必需的select idnum from sample_divya1

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

答案 1 :(得分:0)

一次:

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, sample_divya1 sd1, sample_divya3 sd3
WHERE sda.tablenum = sd1.idnum
  AND sd1.clientname = sd3.clientname;