【问题标题】:How to insert database mysql. Solve?如何插入数据库mysql。解决?
【发布时间】:2021-05-02 19:02:28
【问题描述】:

如何将文件数据插入到表mysql中?

代码:

import pymysql.cursors
import pymysql as MySQLdb
import pymysql
from Bio import SeqIO

try:
    conexao = MySQLdb.connect(host="localhost",user="root",passwd="xxx",db="db_teste")
    print("conectado")
    print(conexao)
except:
    print("Não conectado")


for item in SeqIO.parse('seqteste.txt', 'fasta'):
    dados = print('>{}\t{}'.format(str(item.description).replace('|', '\t'), item.seq), )
    with conexao:
         with conexao.cursor() as cursor:
            sql =  "INSERT INTO `tabelateste` (`id`, `id_name`, `host`, `organism`, `seq`) VALUES(1, %s, %s, %s,%s, %s)"
            cursor.execute(sql, (dados, dados, dados, dados, dados,))
            conexao.commit()

错误:

pymysql.err.OperationalError: (1136, "Column count doesn't match value count at row 1")

我们的:

sql =  "INSERT INTO `tabelateste` (`id`, `id_name`, `host`, `organism`, `seq`) VALUES(%s, %s, %s, %s,%s, %s)"
            cursor.execute(sql, (dados, dados, dados, dados, dados))
            conexao.commit()

error:

    line 125, in mogrify
        query = query % self._escape_args(args, conn)
    TypeError: not enough arguments for format string

如何解决这个错误,并能够在mysqldb表中插入数据?

我的序列:

>gb:KX262887|Organism:Zika virus|Strain Name:103451|Segment:null|Subtype:Asian|Host:Human
GTTGTTGATCTGTGTGAATCAGACTGCGACAGTTCGAGTTTGAAGCGAAAGCTAGCAACAGTATCAACAG
GTTTTATTTTGGATTTGGAAACGAGAGTTTCTGGTCATGAAAAACCCAAAAAAGAAATCCGGAGGATTCC

>gb:KX262887|Organism:Zika virus|Strain Name:103451|Segment:null|Subtype:Asian|Host:Human
    GTTGTTGATCTGTGTGAATCAGACTGCGACAGTTCGAGTTTGAAGCGAAAGCTAGCAACAGTATCAACAG
    GTTTTATTTTGGATTTGGAAACGAGAGTTTCTGGTCATGAAAAACCCAAAAAAGAAATCCGGAGGATTCC

>gb:KX262887|Organism:Zika virus|Strain Name:103451|Segment:null|Subtype:Asian|Host:Human
    GTTGTTGATCTGTGTGAATCAGACTGCGACAGTTCGAGTTTGAAGCGAAAGCTAGCAACAGTATCAACAG
    GTTTTATTTTGGATTTGGAAACGAGAGTTTCTGGTCATGAAAAACCCAAAAAAGAAATCCGGAGGATTCC

预期退出输出:

mysql数据库

id  id_name            host        organism         seq
1   gb:KX262887        Human       Zika Virus       aatgtgttt

解决?

【问题讨论】:

  • 为什么总是插入相同的 ID 值?那应该是AUTO_INCREMENT,在这种情况下,它会从插入列表中省略,或者是预先生成的。
  • 提示:您有 1 个固定值 + 5 个占位符 = 6,但只指定了 5 列。请记住,每个%s 都应该有一个对应的值列。
  • 我想插入打印出来的数据 column1 Human column2 Dengue ... id_name host organic seq 1 gb: KX262887 Human Zika Virus aatgtgttt 但是,我无法解决错误
  • 做什么:'' mysql > SHOW TABLES; '' 为您的数据库显示

标签: mysql sql pymysql biopython


【解决方案1】:

您必须仔细匹配列、占位符和值,以便每个都有一个相同的编号:

sql =  "INSERT INTO `tabelateste` (`id`, `id_name`, `host`, `organism`, `seq`) VALUES(%s, %s, %s, %s, %s)"
            cursor.execute(sql, (dados, dados, dados, dados, dados))
            conexao.commit()

注意现在元组中如何指定 5 个列、5 个占位符和 5 个绑定。你有一个额外的%s

从概念上讲,您想要做的是:

(column_name, ...) <-- Columns specified
     |
     v
(   %s      , ... ) <-- Placeholders specified
     |
     v
(bind_value , ... ) <-- Binding on execute()

请注意,这些必须与 1:1:1 完全相关。任何不匹配都会导致您看到的错误。

【讨论】:

  • 我试图更改列数并给出了一个新错误...我在 TypeError: not all arguments converted during string formatting 下分享了脚本
  • 如果您遇到一个全新的问题,可能值得针对该特定问题提出一个新问题。很多时候,一件事导致另一件事,这很好。如果它帮助您更接近您的目标,或者如果另一个帮助,请接受这个答案。
  • @tadman 不是这里的错误: cursor.execute(sql, (dados, dados, dados, dados, dados,) 是dados 的定义方式: dados = print('>{}\t {}'.format(str(item.description).replace('|', '\t'), item.seq), ) ?
  • @pippo1980 这可能是另一个问题,因为我认为print 没有返回任何有用的信息。
  • @tadman 他/她是否解析为 fasta 东西应该被解析为 genbank 文件?我不在该字段中,输入是否显示在良好的 genbank 格式之上?
【解决方案2】:

改变:

for item in SeqIO.parse('seqteste.txt', 'fasta'):
    dados = print('>{}\t{}'.format(str(item.description).replace('|', '\t'), item.seq), )

进入

import re

cnt = 0
for item in SeqIO.parse('seqteste.txt', 'fasta'):
    cnt += 1
    s=(str((item.description).strip('')))
    pattern_id = "(.*?)\|Organism"
    pattern_host = "Host:(.*.)"
    pattern_org = "Organism:(.*?)\|Strain"
    ids= re.search(pattern_id, s).group(1)
    host = re.search(pattern_host, s).group(1)
    org = re.search(pattern_org, s).group(1)
    dados = [str(cnt), ids ,host , org   ,str(item.seq)]

和:

 cursor.execute(sql, (dados, dados, dados, dados, dados))

与:

cursor.execute(sql, (dados[0] , dados[1] ,dados[2] ,dados[3] ,dados[4]))

告诉我它的行为,我没有你的数据库,无法测试我的代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多