1

私は config.ini を持っています:

[mysql]
host=localhost
port=3306
user=root
passwd=abcdefgh
db=testdb
unix_socket=/opt/lampp/var/mysql/mysql.sock

私はこのクラスを持っています:

#!/usr/bin/python
import MySQLdb,ConfigParser
config = ConfigParser.ConfigParser()
config.read("config.ini")

class MySQL( object ):

    def __init__( self ):
        self.host   = config.get("mysql","host")
        self.port   = config.get("mysql","port")
        self.user   = config.get("mysql","user")
        self.passwd = config.get("mysql","passwd")
        self.db     = config.get("mysql","db")
        self.unix_socket = config.get("mysql","unix_socket")

        self.conn   = MySQLdb.Connect(self.host,
                                      self.port,
                                      self.user,
                                      self.passwd,
                                      self.db,
                                      self.unix_socket)

        self.cursor = self.conn.cursor ( MySQLdb.cursors.DictCursor )

    def __del__( self ):
        self.cursor.close()
        self.conn.close()

この:

#!/usr/bin/env python  
from mysql import MySQL

class Incident( MySQL ):

    def getIncidents( self ):
        self.cursor.execute("""*VALID QUERY*""")
        return self.cursor.fetchall()

そして最後にこれ:

import subprocess, os, alarm
from Queue import Queue
from incident_model import Incident

fileQueue = Queue()

def enumerateFilesPath():
  global fileQueue
  incident = Incident()
  incidents = incident.getIncidents()
  for i in incidents:
    fileQueue.put("MD5")

def main():
    global fileQueue
    enumerateFilesPath()

出力:

トレースバック (最後の最後の呼び出し):
ファイル "./mwmonitor.py"、202 行目、

main() ファイル "./mwmonitor.py"、184 行目、main
enumerateFilesPath() ファイル "./mwmonitor.py"、 86 行目、
enumerateFilesPath
インシデント = Incident() ファイル "/usr/share/mwanalysis/core/mysql.py"、23
行目、init
self.unix_socket) ファイル "/usr/lib/pymodules/python2.6/MySQLdb/ init .py"、
81 行目、Connect
return Connection(*args, **kwargs) ファイル
"/usr/lib/pymodules/python2.6/MySQLdb/connections.py"、170
行目、init
super(Connection, self )。init (*args, **kwargs2)
TypeError: 整数が必要です
Exception AttributeError: "'Incident'
object has no attribute 'cursor'" in
0xa03d46c>> 無視され ました

誰かがエラーの検出と修正を手伝ってくれるなら、大歓迎です。前もって感謝します。

4

3 に答える 3

2

あなたの__del__方法は混乱を引き起こしています。具体的には、たとえば、例外が発生した場合に作成されない可能性があるself.cursorandを参照します (これが発生するようです)。self.connMySQLdb.Connect

クラスを次のように変更することをお勧めします。

class MySQL( object ):

    def __init__( self ):

        self.conn   = None
        self.cursor = None

        self.host   = config.get("mysql","host")
        self.port   = config.get("mysql","port")
        self.user   = config.get("mysql","user")
        self.passwd = config.get("mysql","passwd")
        self.db     = config.get("mysql","db")
        self.unix_socket = config.get("mysql","unix_socket")

        self.conn   = MySQLdb.Connect(self.host,
                                      self.port,
                                      self.user,
                                      self.passwd,
                                      self.db,
                                      self.unix_socket)

        self.cursor = self.conn.cursor ( MySQLdb.cursors.DictCursor )

    def __del__( self ):
        if self.cursor is not None:
            self.cursor.close()
        if self.conn is not None:
            self.conn.close()

これで問題が解決するわけではありませんが、より適切な診断が得られるはずです。

今あなたが経験している実際の問題に。Connectに引数を間違った順序で指定している、またはタイプが正しくない、またはそれらの線に沿った何かを強く疑っています。の docstring を引用するにはConnection.__init__:

    Create a connection to the database. It is strongly recommended
    that you only use keyword parameters. Consult the MySQL C API
    documentation for more information.

    host
      string, host to connect

    user
      string, user to connect as

    passwd
      string, password to use

    db
      string, database to use

    port
      integer, TCP/IP port to connect to

    unix_socket
      string, location of unix_socket to use

    ...

「キーワード パラメータのみを使用することを強くお勧めします。」に電話するときは、そのようにすることをお勧めしますMySQLdb.Connect。また、文字列ではなく、でportあることを確認してください。int

于 2011-05-24T20:26:46.967 に答える
1

port文字列ではなく整数になることを期待していると思います。試す:

self.port   = int(config.get("mysql","port"))
于 2011-05-24T17:09:43.863 に答える
0

これが接続エラーかどうかはわかりません。件のタイプを確認しましたか? TypeError: an integer is required Exception AttributeError: "'Incident'object has no attribute 'cursor'" in

于 2011-05-24T17:10:43.620 に答える