【问题标题】:Python mysql database insert query, thread error [closed]Python mysql数据库插入查询,线程错误[关闭]
【发布时间】:2014-02-05 05:42:11
【问题描述】:

这是我的代码,它使调用(除了插入的最后一行之外,一切都很好)所有必需的导入都在那里并且工作。查询一定有问题。

db = Database()
soup = bs(mytrades)

for row in soup.findAll("tr"):
    cols = row.findAll("td")
    data = []
    for col in cols:
        data.append(col.text)

        query = """INSERT INTO zulutrades VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s), (128391,"""+data[0]+""","""+data[1]+""","""+data[2]+""","""+data[3]+""","""+data[4]+""","""+data[5]+""","""+data[6]+""","""+data[7]+""","""+data[8]+""","""+data[9]+""","""+data[10]+""")"""       
        db.insert(query)

*“错误”(我没有发布它是因为我认为它没有多大意义)*

Exception in thread Thread-192 (most likely raised during interpreter shutdown):Exception in thread Thread-2 (most likely raised during interpreter shutdown):
Traceback (most recent call last):

File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
File "/usr/lib/python2.7/threading.py", line 763, in run
File "/usr/local/lib/python2.7/dist-packages/windmill-1.6-py2.7.egg/windmill/server/https.py", line 401, in start
File "/usr/lib/python2.7/SocketServer.py", line 280, in handle_request
File "/usr/lib/python2.7/SocketServer.py", line 291, in _handle_request_noblock
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'error'
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
File "/usr/lib/python2.7/threading.py", line 763, in run
File "/usr/lib/python2.7/SocketServer.py", line 597, in process_request_thread
File "/usr/lib/python2.7/SocketServer.py", line 471, in shutdown_request
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'error'

我正在使用以下 mysql 数据库类:

class Database:

    host = 'localhost'
    user = 'wind'
    password = 'mill'
    db = 'windmill'

    def __init__(self):
        self.connection = MySQLdb.connect(self.host, self.user, self.password, self.db)
        self.cursor = self.connection.cursor()

    def insert(self, query):
        try:
            self.cursor.execute(query)
            self.connection.commit()
        except:
            self.connection.rollback()



    def query(self, query):
        cursor = self.connection.cursor( MySQLdb.cursors.DictCursor )
        cursor.execute(query)

        return cursor.fetchall()

    def __del__(self):
        self.connection.close()

这是 mysql 表

CREATE TABLE IF NOT EXISTS `zulutrades` (
`id` int(10) NOT NULL,
`currency` varchar(8) NOT NULL,
`type` varchar(8) NOT NULL,
`std_lots` int(8) NOT NULL,
`date_open` varchar(20) NOT NULL,
`date_closed` varchar(20) NOT NULL,
`open_close` varchar(20) NOT NULL,
`high` float NOT NULL,
`low` float NOT NULL,
`roll` float NOT NULL,
`profit` varchar(10) NOT NULL,
`total` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 您的问题是什么?我的是“最后一行到底发生了什么?”
  • 在那里,我发布了回溯——尽管我认为它意义不大。就像我写的那样,问题似乎出在查询上。没有任何东西被插入到数据库中。
  • finaldata=[1278391]+data[:10] "插入 zulutrades 值 (%s,%s,%s,%s,%s,%s,%s,%s,% s,%s,%s,%s)"%tuple(finaldata)
  • 我试过你的行,它给出了错误:TypeError: not enough arguments for format string
  • zulutrades 表的结构是什么?

标签: python mysql


【解决方案1】:
query = """INSERT INTO zulutrades VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s), (128391,"""+data[0]+""","""+data[1]+""","""+data[2]+""","""+data[3]+""","""+data[4]+""","""+data[5]+""","""+data[6]+""","""+data[7]+""","""+data[8]+""","""+data[9]+""","""+data[10]+""")"""       

在这里,您正在为 两个 行构建一个INSERT 查询(注意VALUES 子句后面的两个括号组);第一行仅包含 12 个占位符,而第二行包含直接连接在查询字符串中的 12 个值。此查询不会成功,因为您永远不会在 cursor.execute(query) 方法内的 cursor.execute(query) 调用中为占位符提供值。

您的Database.queryDatabase.insert 方法需要重写以支持将查询参数传递给cursor.execute 方法:

class Database:
    ...

    def insert(self, query, params):
        try:
            self.cursor.execute(query, params)
            self.connection.commit()
        except:
            self.connection.rollback()

    def query(self, query, params):
        cursor = self.connection.cursor( MySQLdb.cursors.DictCursor )
        cursor.execute(query, params)

        return cursor.fetchall()

但是,您的循环也是错误的。您正在为rows.findAll('td') 返回的每个cell 执行INSERT 查询,notsoup.findAll('tr') 返回的每个rowINSERT 应该发生在 outer 循环中,而不是内部:

query = 'INSERT INTO zulutrades VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
for row in soup.findAll("tr"):
    cols = row.findAll("td")
    data = []
    for col in cols:
        data.append(col.text)

    db.insert(query, [128391] + data)

如您所见,查询字符串本身不再需要在循环体中定义,因为它不再针对您要插入的每一行进行更改 — 现在只有执行参数更改,但这些参数作为db.insert 的单独参数。

【讨论】:

  • 我仍然收到错误:AttributeError: Database instance has no attribute 'insert'
  • 您的 Database 类在您的示例中显然有一个 insert 方法。如果你得到AttributeError,你显然没有执行你发布的相同代码,或者你在某个时候删除了instance方法。
  • 如果有人感兴趣,我必须明确重写插入行以使其工作:params = (128391, data[1], data[2], data[3], data[4] , data[5], data[6], data[7], data[8], data[9], data[10], data[11]) db.insert(query, params)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2013-05-07
相关资源
最近更新 更多