Проблемы подключения Python и MySQL (mysqldb api) - PullRequest
1 голос
/ 24 мая 2011

У меня есть 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()

Выход:

Traceback (последний последний вызов):
Файл "./mwmonitor.py", строка 202, в

Файл main () "./mwmonitor.py", строка 184, в основном
Файл enumerateFilesPath () "./mwmonitor.py", строка 86, в
enumerateFilesPath
инцидент = файл инцидента () "/usr/share/mwanalysis/core/mysql.py",
строка 23, в init
self.unix_socket) Файл "/usr/lib/pymodules/python2.6/MySQLdb/init.py",
линия 81, в соединении
Обратное соединение (* args, ** kwargs) Файл
«/usr/lib/pymodules/python2.6/MySQLdb/connections.py",
строка 170, в init
super (Соединение, self). init (* args, ** kwargs2)
Ошибка типа: требуется целое число
Exception AttributeError: "Инцидент"
объект не имеет атрибута "курсор" в
0xa03d46c >> игнорируется

Если кто-то может помочь обнаружить и исправить ошибку, буду очень признателен. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

Ваш __del__ метод вызывает путаницу.В частности, это относится к self.cursor и self.conn, которые могут никогда не быть созданы, если, например, MySQLdb.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 в неправильном порядке, или типы не совсем правильные, или что-то в этом роде.Чтобы процитировать строку документации для 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, а не строкой.

1 голос
/ 24 мая 2011

Я подозреваю, что port будет целым числом, а не строкой.Попробуйте:

self.port   = int(config.get("mysql","port"))
0 голосов
/ 24 мая 2011

Я не уверен, что это ошибка подключения.Вы проверили тип инцидентной модели?TypeError: an integer is required Exception AttributeError: "'Incident'object has no attribute 'cursor'" in

...