insertar datos crear consultar conexion conectar con python mysql sqlite sqlite3 mysql-python

datos - cursor.execute python



Usando mysqldb y sqlite3 en el mismo script de Python 2.7: ¿Debería tirar la toalla? (2)

Cada base de datos de respaldo admite diferentes tipos de datos. Los módulos sqlite y mysqldb python intentan ayudarlo haciendo las conversiones de tipo apropiadas según los tipos de campo. Por lo tanto, si su base de datos mysql tiene un campo DECIMAL, MySQLdb devolverá ese campo automáticamente como un objeto decimal de Python.

Puede solicitar MySQLdb (y sqlite si lo desea) para hacer la conversión de tipo apropiado entre la base de datos y los tipos de Python. Depende de usted determinar qué tipo de conversión es la adecuada. Por ejemplo, dado que su base de datos tiene un campo DECIMAL, ¿cómo va a representar ese valor en sqlite que no tiene un campo DECIMAL nativo? Probablemente termines usando un REAL, pero por supuesto esto no es lo mismo que un DECIMAL que mantendrá la precisión requerida.

Como ya estaba convirtiendo datos de csv, sospecho que ha estado usando el tipo de flotador de Python, lo que indica que está contento de convertir los campos de decimal de MySQL para flotar. En este caso, puede solicitar que MySQLdb haga una conversión de DECIMAL para flotar en todos los resultados de campo.

Aquí hay un ejemplo de código que crea dos tablas, una en mysqldb y sqlite. La versión de MySQL tiene un campo DECIMAL. Puede ver en la función query_dbs cómo crear sus propias funciones de conversión.

#!/usr/bin/env python import os import sqlite3 import MySQLdb from MySQLdb.constants import FIELD_TYPE user = os.getenv(''USER'') def create_mysql_table(): conn = MySQLdb.connect(user=user, db=''foo'') c = conn.cursor() c.execute("DROP TABLE stocks") c.execute("CREATE TABLE stocks" "(date text, trans text, symbol text, qty real, price Decimal(10,2) UNSIGNED NOT NULL)") c.execute("INSERT INTO stocks VALUES (''2006-01-05'',''BUY'',''RHAT'',100,35.14)") conn.commit() def create_sqlite_table(): conn = sqlite3.connect(''test.db'') c = conn.cursor() c.execute("DROP TABLE stocks") c.execute("CREATE TABLE stocks" "(date text, trans text, symbol text, qty real, price real)") c.execute("INSERT INTO stocks VALUES (''2006-01-05'',''BUY'',''RHAT'',100,35.14)") conn.commit() def query_dbs(use_type_converters): conn = sqlite3.connect(''test.db'') c = conn.cursor() for row in c.execute(''SELECT * FROM stocks''): print ''SQLITE: %s'' % str(row) type_converters = MySQLdb.converters.conversions.copy() if use_type_converters: type_converters.update({ FIELD_TYPE.DECIMAL: float, FIELD_TYPE.NEWDECIMAL: float, }) conn = MySQLdb.connect(user=user, db=''foo'', conv=type_converters) c = conn.cursor() c.execute(''SELECT * FROM stocks'') for row in c.fetchall(): print ''MYSQLDB: %s'' % str(row) create_sqlite_table() create_mysql_table() print "Without type conversion:" query_dbs(False) print "With type conversion:" query_dbs(True)

Este script produce la siguiente salida en mi máquina:

Without type conversion: SQLITE: (u''2006-01-05'', u''BUY'', u''RHAT'', 100.0, 35.14) MYSQLDB: (''2006-01-05'', ''BUY'', ''RHAT'', 100.0, Decimal(''35.14'')) With type conversion: SQLITE: (u''2006-01-05'', u''BUY'', u''RHAT'', 100.0, 35.14) MYSQLDB: (''2006-01-05'', ''BUY'', ''RHAT'', 100.0, 35.14)

Lo que esto muestra es que, por defecto, MySQLdb está devolviendo tipos de Decimal, pero puede ser forzado a devolver un tipo diferente, adecuado para uso con sqlite.

Entonces, una vez que tenga todos los tipos normalizados entre las dos bases de datos, ya no tendrá problemas con las combinaciones.

Los documentos Python MySQLdb están aquí

Estoy escribiendo una secuencia de comandos de Python que debe extraer, procesar y actualizar a una base de datos MySQL.

Originalmente comencé a atacar este problema con los volcados de valores separados por comas de las bases de datos MySQL, que arrojaría en una base de datos sqlite (usando sqlite3). Haría el procesamiento en Python (2.7), crearía un archivo CSV de la salida, que cargaría de nuevo a la base de datos MySQL con otra secuencia de comandos.

Bueno, entonces pensé que trataría de simplemente tirar / empujar a la base de datos MySQL directamente desde el script de Python. Así que instalé MySQLdb, y fui a la ciudad en eso.

Lo que estoy descubriendo ahora es que mis INSERT s de la base de datos MySQL (en la base de datos sqlite) no se están uniendo como lo estaban antes. Las representaciones de los enteros ahora tienen una L al final, y los valores decimales se expresan como algo así como Decimal(''4.00'') .

Básicamente, las cosas que se JOIN muy bien cuando las estaba insertando desde los archivos CSV no funcionan tan bien ahora.

Mi pregunta : ¿estoy pidiendo un mundo de dolor que continúe por este camino, o existe una manera fácil de obtener bibliotecas MySQLdb y sqlite3 para jugar juntas? Si no hay, entonces instalaré un servidor MySQL y refactorizaré mi código para usar solo MySQL.


No hay conflicto entre sqlite3 y MySQLdb, por lo que debería poder usarlos en el mismo programa. Sin embargo, también podría considerar el uso de SQLAlchemy , que proporciona una interfaz de nivel superior para ambos tipos de bases de datos.

En cuanto a por qué está viendo realmente este problema, los síntomas que describe sugieren que está convirtiendo incorrectamente números a cadenas, en particular, que está usando repr() lugar de str() .