How to finally fix that damned MySQLdb module on Leopard


Ciao ragazzi,

no, non mi sono impazzito, l’articolo è in italiano :D

Oggi voglio parlarvi di un mio esperimento portato a termine con successo. Molti di voi (spero nessuno) avranno perso il sonno nel tentare di far funzionare su leopard il modulo python MySQLdb, assolutamente indispensabile per gestire i database mysql con python, altrettanto indispensabile per usare Django.

Nota ai naviganti:  Se siete su Leopard e dovete ancora installare mysql, allora installate la versione mysql-5.0.67-osx10.4-universal.tar. gz, perchè pare che risolva i problemi di architettura. 

Cosa centra l’architettura? Il problema nasce dal fatto che è molto facile avere installata una versione di python a 32 bit, il server apache della apple a 64 bit e mysql o a 64 o a 32bit.. di conseguenza quando si prova ad importare il modulo di incappa nel seguente errore:

Traceback (most recent call last):
File “”, line 1, in
File “MySQLdb/__init__.py”, line 19, in
import _mysql
File “build/bdist.macosx-10.5-i386/egg/_mysql.py”, line 7, in
File “build/bdist.macosx-10.5-i386/egg/_mysql.py”, line 6, in __bootstrap__
ImportError: dynamic module does not define init function (init_mysql)
>>>

Ma andiamo con ordine.

Installazione e configurazione

Ci sono un sacco di guide sull’ installazione, che vi riporto come references a fine articolo, ma vediamo speditamente cosa fare. Prima di tutto scaricate il modulo dal sito ufficiale di MySQLdb, decomprimetelo ed entrate nella cartella. Per prima cosa dovete aprire il file _mysql.c e  commentare le seguenti linee:

37 //#ifndef uint 
38 //#define uint unsigned int 
39 //#endif 

dove i numeri sono i numeri di riga per una facile individuazione. Dopodichè cambiate queste altre:

484 unit port = MYSQL_PORT;

deve diventare: unsigned int port = MYSQL_PORT; 
485 unit client_flag = 0;

deve diventare: unsigned int client_flag = 0;

Bene. Ora aprite il file site.cfg e cambiate:

threadsafe = True 

in

threadsafe = False

Ora scaricatevi la versione di mysql che vi ho consigliato qualche riga fa ma NON INSTALLATELA! Piuttosto scompattatela in una cartella a vostro piacere: (es. /Users/vostrahome/mysql/).

A questo punto sempre nel file site.cfg aggiungete (o modificate se c’è) la seguente riga:

 

mysql_config = /Users/vostrahome/mysql/bin/mysql_config

dove /Users/vostrahome/mysql è la cartella dove avete decompresso la versione scaricata di mysql.

Perfetto! Adesso la procedura d’installazione dovrebbe andare per il meglio. Lanciate da shell:

python setup.py build
sudo python setup.py install

E dovrebbe filare tutto liscio. Adesso create un soft link in questo modo:

sudo ln -s /usr/local/mysql/lib/ /usr/local/mysql/lib/mysql

Poichè siamo su Mac o non su Linux. Di solito a questo punto dovreste avere una versione di MySQLdb funzionante. Per me non è stato così. Nel mio caso ha funzionato copiare la cartella lib contenuta in /Users/vostrahome/mysql dentro la mia directory di installazione di mysql, cioè /usr/local/mysql/lib/.

Per chi non fosse pratico di permessi e cose varie, prima fate un backup delle vecchie librerie :

cd /usr/local/mysql/
sudo cp -R lib lib.bak
cd lib
sudo rm *
cd ..
sudo rmdir lib
sudo cp -R /Users/vostrahome/mysql/lib /usr/local/mysql/

A questo punto se tutto è andato bene dovreste avere il vostro MySQLdb funzionante!

Ogni macchina è diversa dalle altre, quindi c’è la possibilità che la procedura che vi ho descritto possa non funzionare sui vostri computer. Per questo vi lascio dei link utili dove viene spiegato lo stesso procedimento ma con approcci diversi. Alla prossima, ciao!

Alfredo

REFERENCES:

Problems in Building 1.2.2 on Mac Os 10.5

David Cramer.net – MySQLdb on Leopard

Antonio Cangiano – How to install Django with MySQLdb on MacOSx

About these ads

Un pensiero su “How to finally fix that damned MySQLdb module on Leopard

  1. OK – done, but now I get this:
    OK – fatto, ma ora ho questo:

    $ python
    Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13)
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type “help”, “copyright”, “credits” or “license” for more information.
    >>> import MySQLdb
    /Library/Python/2.5/site-packages/MySQL_python-1.2.2-py2.5-macosx-10.5-i386.egg/_mysql.py:3: UserWarning: Module _mysql was already imported from /Library/Python/2.5/site-packages/MySQL_python-1.2.2-py2.5-macosx-10.5-i386.egg/_mysql.pyc, but /Users/stephen/python/install/MySQL-python-1.2.2 is being added to sys.path
    import sys, pkg_resources, imp
    Traceback (most recent call last):
    File “”, line 1, in
    File “MySQLdb/__init__.py”, line 19, in
    import _mysql
    File “build/bdist.macosx-10.5-i386/egg/_mysql.py”, line 7, in
    File “build/bdist.macosx-10.5-i386/egg/_mysql.py”, line 6, in __bootstrap__
    ImportError: dynamic module does not define init function (init_mysql)

    :-(

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...