MySQL int wird immer zu long

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Jan.O
User
Beiträge: 61
Registriert: Samstag 26. April 2008, 00:32

Hi,
As mentioned earlier, while MySQL's INTEGER column translates perfectly into a Python integer, UNSIGNED INTEGER could overflow, so these values are converted to Python long integers instead.
dass ein unsigned int von mysql in python zu long gecastet wird ist verständlich. Bei signed ints sollte das nach offizieller docu nicht der fall sein. Aber irgendwie ist das bei mir auch bei signed ints so?!


Hat jemand ne idee, wodran das liegen könnte?

Jan
Jan.O
User
Beiträge: 61
Registriert: Samstag 26. April 2008, 00:32

GOTT!!... War das mal wieder ein gewurstel bis ichs rausgefunden habe... Programmierer-frust

Code: Alles auswählen

import MySQLdb.converters
from MySQLdb.constants import FIELD_TYPE
MYSQL_CONV = MySQLdb.converters.conversions.copy()
MYSQL_CONV[FIELD_TYPE.LONG] = int
So werden mysql-ints zu python-ints, es sei denn die mysql-ints sind größer als der python-int. Dann wird der mysql-int zum python-long.

statt MYSQL_CONV[...] = int kann man auch eine eigene funktion nehmen, zB:

Code: Alles auswählen

def int_or_long(number):
    try: return int(number)
    except ValueError: return long(number)
ist aber überflüssig, denn int(<zugroßezahl>) gibt einen long zurück.

dann beim connecten nur noch:

Code: Alles auswählen

    global_db = MySQLdb.connect(
        host=Config.GLOBAL_DB_HOST,
        db=Config.GLOBAL_DB_NAME,
        user=Config.GLOBAL_DB_USER,
        passwd=Config.GLOBAL_DB_PASS,
        conv=MYSQL_CONV)#<==-

Ich hoffe, ich konnte auch anderen helfen.

Jan
BlackJack

Was war eigentlich das Problem? Warum muss es unbedingt ein `int` sein?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Jan.O hat geschrieben:GOTT!!... War das mal wieder ein gewurstel bis ichs rausgefunden habe... Programmierer-frust
Mich täte es eher frustrieren, dass ich etwas vollständig sinnloses gemacht habe - zwischen int und long gibt es in aktuellen Python-Versionen fast keinen Unterschied, geht so weit, dass es in Python 3 keinen long mehr gibt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten