conectar con django sqlite postgresql data-migration

conectar django con postgresql en windows



Django: ¿Cuáles son las mejores prácticas para migrar un proyecto de sqlite a PostgreSQL? (7)

Necesito migrar un proyecto complejo de sqlite a PostgreSQL. Mucha gente parece tener problemas con las claves externas, datos truncados, etc.

  • ¿Hay una utilidad completamente automatizada?
  • ¿Debo verificar algunos datos o esquemas antes de la migración?

Edición : probé django-command-extensions DumpScript pero no se ejecuta en mi PC RAM de 2GB con mi DataSet actual.


De acuerdo con la respuesta de @Nimo, utilizada desde "syncdb" , "syncdb" no funciona en Django 1.9 y superior (eso funciona en Django 1.7 )

En lugar de eso, usa el siguiente comando:

python manage.py migrate

Y la configuración de configuración de Postgres está aquí:

DATABASES = { ''default'': { ''ENGINE'': ''django.db.backends.postgresql_psycopg2'', ''NAME'': ''myproject'', ''USER'': ''myprojectuser'', ''PASSWORD'': ''password'', ''HOST'': ''localhost'', ''PORT'': '''', } }


En mi experiencia, el volcado y restauración desde SQL no funciona correctamente.

Deberías seguir esta secuencia en su lugar:

1. Volcar contenido db a json

$ ./manage.py dumpdata > dump.json

2. Cambie el backend en settings.py

DATABASES = { # COMMENT OUT: # ''default'': dj_database_url.config(default=''sqlite:////full/path/to/your/database/file.sqlite''), # ADD THIS INSTEAD: ''default'': dj_database_url.config(default=''postgres://localhost:5432/postgres_db_name''), }

3. Syncdb y migra el nuevo DB a la misma estructura de tabla

$ ./manage.py syncdb $ ./manage.py migrate

4. Cargue el json a la nueva db.

$ ./manage.py loaddata dump.json

5. ¡Felicidades! Ahora los nuevos datos están en tu db postgres.


Lo primero es lo primero que me gustaría probar un simple:

sqlite3 sqllitedb .dump | psql postgresdb

En ese punto, simplemente pruébalo. Escriba algunos scripts de prueba en Django para generar un conjunto de registros de muestra para cada aplicación, y luego haga una diferencia para asegurarse de que sean idénticos. Si lo son, entonces tu conversión probablemente esté bien.

Si eso no funciona ...

Recomiendo no usar Django para volcar y cargar los datos, ya que supongo que no está optimizado para hacerlo.

En su lugar, crearía una segunda versión de su aplicación con la configuración correcta de la base de datos de PostgreSQL, ejecutaría syncdb para crear todas las tablas, luego copiaría los datos de mysqllite a PostgreSQL usando otra herramienta.

El problema es que la mayoría de los problemas al convertir sobre datos se encuentran en las definiciones de la tabla, etc. Esos parecen ser los más idiosincrásicos. Si puede generar un script SQL que sea un volcado de solo el contenido de la tabla, eso debería ser un comando SQL INSERT INTO bastante estándar.

Honestamente, no puedo ver por qué habría problemas de clave externa. Suponiendo que sqlite esté creando claves externas precisas (¿y por qué no lo haría?), Entonces no hay forma de que no se copien correctamente. Realmente, las claves externas no son formas especiales de datos. No es más probable que el campo UserProfile.user_id contenga un valor incorrecto que el campo UserProfile.photo . Si el problema de la clave externa es que los campos en sí mismos no se identifican correctamente como campos de clave externa (es decir, sin restricciones), entonces la opción de crear primero la base de datos utilizando syncdb solucionará ese problema.

Según el truncamiento: como lo entiendo, PostgreSQL produce un error grave si los datos están a punto de ser truncados. No sé si ese es el caso de sqlite o si simplemente se trunca en silencio. De cualquier manera, una vez más, asumiendo que sqlite no está mezclando de alguna manera los datos de exportación, los campos deben contener datos que tengan la longitud adecuada para el campo en el que se está ingresando. Lo único que puedo pensar que podría afectar esto es la codificación de caracteres, así que haga asegúrese de que los campos de PostgreSQL tengan la misma codificación que las tablas de sqlite, al menos durante la importación.


Lo que me funcionó fue ejecutar la secuela de Ruby. Simplemente ejecute el comando:

gem install sequel

Necesitará tener instalados en su sistema los paquetes de desarrollo para postgres, sqlite y ruby ​​Ejecute el comando:

gem install pg sqlite3

Cree una base de datos vacía en postgresql, digamos testDB y asigne un permiso de concesión a un usuario Desde la ejecución del símbolo del sistema:

sequel -C sqlite:///path/to/sqlitedb.db postgres://user:password@host/testDB

Esto se ejecutará sin errores.

Cambie la configuración en su proyecto de django para trabajar con la base de datos postgres. Ejecutar

./manage migrate (not necessary)

Ejecuta el servidor


Lo siguiente es un refinamiento de la respuesta de Nimo y la respuesta de Stephen para Django 1.7+:

  1. ./manage.py dumpdata --natural-primary --natural-foreign > dump.json
  2. Cambie DATABASES en settings.py para que apunte a la nueva base de datos (PostgreSQL).
  3. ./manage.py migrate
  4. ./manage.py loaddata dump.json

Un problema que encontré es que SQLite no parece realmente imponer la longitud máxima para CharField s. En mi caso, esto hizo que el paso de loaddata fallara. Pude encontrar (y eliminar) instancias de modelos con valores CharField demasiado largos a través de:

MyModel.objects.extra(where=["LENGTH(text) > 20"]).delete()

Una vez que hice esto antes del paso 1. anterior, todo funcionó.


Nunca he tenido que hacerlo pero lo que intentaría es.

  1. Dejar de ejecutar servidores
  2. python manage.py dumpdata
  3. Alterar settings.py para apuntar a la base de datos postgres recién creada
  4. python manage.py loaddata

Otra forma de hacer esto puede ser usar múltiples bases de datos.

http://docs.djangoproject.com/en/dev/topics/db/multi-db/

Es importante que lea esta sección.

http://docs.djangoproject.com/en/dev/topics/db/multi-db/#moving-an-object-from-one-database-to-another

Por lo que entiendo, eso significa que siempre que no haya datos en su nueva base de datos, por ejemplo, puede hacer

queryset = MyModel.objects.using("old-db").all() for obj in queryset: obj.save(using="new-db")

Debido a que eso debería conservar las claves primarias, no creo que haya problemas con claves externas.