2

我有 8 种数据我想通过 mysql-connector 使用 python 插入到 mysql 表中。我看过一些文档说使用 mysql-connector 时最好使用int、string 或 tuple 。我试图将一些数据类型调整为字符串或元组,但 IDE 一直显示错误......如果有人请帮助我澄清我将使用哪种数据类型。

数据结构设置如下(如果有什么更好的改变请告诉我):

+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| URL      | varchar(1023) | YES  |     | NULL    |       |
| Title    | varchar(1023) | YES  |     | NULL    |       |
| Content  | varchar(1023) | YES  |     | NULL    |       |
| Month    | varchar(1023) | YES  |     | NULL    |       |
| Date     | varchar(1023) | YES  |     | NULL    |       |
| Year     | varchar(1023) | YES  |     | NULL    |       |
| Time     | varchar(1023) | YES  |     | NULL    |       |
| TimeZone | varchar(1023) | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+

我的代码如下:

for i in range(len(URL)):
    dbcur.execute(
        """INSERT INTO scripting (URL, Title, Content, Month, Date, Year, Time, TimeZone)
           VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""",
           ((URL[i],), (Title[i],), (Content[i],), (Month[i],), (Date[i],), (Year[i],), 
           (Time1[i],), (TimeZone[i],)))
    dbcon.commit()

ps- URL[], Title[], Content[]... TimeZone[] 是数据列表,它们的范围是一样的。

  • 网址:网址。我用元组设置了这个,很好。(可以成功存储)

  • 标题:一篇文章的标题。(即一个句子)我尝试将其设置为带有 的元组(Title[i],)或带有 的字符串StringIO.String(Title[i]),但错误是

    MySQLConverter' object has no attribute '_tuple_to_mysql  
    AttributeError: 'module' object has no attribute 'String'
    

    分别地。

  • 内容:几句话。面临与上述相同的问题

  • Month, Date, Year, Time, TimeZone:还没试过,但是我想我可以用元组类型导入这些数据?

我查看了 stackoverflow 并尝试了几种数据类型,但在这里仍然行不通。我该如何处理这些数据,有人可以告诉我吗?

4

3 回答 3

1

您将每个单独的参数包装在tuple; 不要那样做。也就是说,改为这样做:

dbcur.execute(
     """INSERT INTO scripting (URL, Title, Content, Month, Date, Year, Time, TimeZone) 
     VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""",
     (URL[i], Title[i], Content[i], Month[i], Date[i], Year[i], Time1[i], TimeZone[i]))

您只需要将所有替换值包装在一个元组中,没有例外。

我明白你为什么感到困惑(“URL:url。我用元组设置它,这很好。” ​​):在下面的例子中,使用 DBAPI单个值也需要包装在 1 元组中),但那是这里仍然适用相同的规则:

 dbcur.execute('INSERT INTO scripting (URL) VALUES (%s)', (URL,))

现在我们只替换URL,但我们仍然将“全部”(例如单个参数)包装在一个元组中。

于 2016-03-10T07:41:39.797 回答
0

在这里,我有一个解决方案。

让我们仅考虑三列作为示例。网址、标题和内容。正如您提到的 URL 和其他是数据列表。

URL=['url1','url2','url3']
TITLE=['title1','title2','title3']

等等。并且您在 DATABASE 表中有相同的列。

cursor_object.execute(query,params)

让我们在这里写一个查询:

query='''
INSERT INTO scripting(URL, TITLE, CONTENT)
VALUES (%s,%s,%s)'''

并执行 sql 命令:

cursor_object.execute(query%(URL[i],TITLE[i],CONTENT[i]))

当它被翻译后,将是第一次迭代的结果。

'INSERT INTO scripting(url, title)VALUES (url1,title1)' url1 在实际翻译成mysql查询时不是这里的字符串。所以你必须改变一点。

query='''
INSERT INTO scripting(URL, TITLE, CONTENT)
VALUES ("%s","%s","%s")'''

或者

或者,您可以使用字典方法。

query=''' *query statement* values
(%(url)s,%(title)s,%(content)s)
dictionary={'url':'url1','title':'title1','content':'content1'}
cursor_object.execute(query,dictionary)

对于多行:

for i in range len(URL):
    cursor_object.execute(query,{'url':URL[i],'title':TITLE[i],'content':CONTENT[i]}

@Antti Haapala 给出了最简单的解决方案。希望你喜欢。

于 2020-09-05T12:23:37.990 回答
-1

zipAntti Haapala 有一个很好的答案,但您也可以通过构建要插入的行来整理它

for row in zip(URL, Title, Content, Month, Date, Year, Time1, TimeZone):
    dbcur.execute(
        """INSERT INTO scripting (URL, Title, Content, Month, Date, Year, Time, TimeZone)
           VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""",
           row)
    dbcon.commit()
于 2016-03-10T07:56:55.327 回答