2009-05-15 22 views
7

Supongamos que tengo una engine apuntando a la base de datos MySQL:¿Cómo generar un archivo con DDL en el dialecto SQL del motor en SQLAlchemy?

engine = create_engine('mysql://arthurdent:[email protected]/dtdb', echo=True) 

que pueden poblar dtdb con mesas, FKs, etc por:

metadata.create_all(engine) 

¿Hay una manera fácil de generar el archivo SQL que contiene todas las instrucciones DDL en lugar de aplicar realmente estas declaraciones DDL al dtdb?

Hasta ahora he recurrido a la captura de la salida de registro SQLAlchemy producida por echo=True, y la edición a mano. Pero eso es demasiado doloroso.

Parece que SA tiene una API de gestión de esquemas muy elaborada, pero no he visto ejemplos de simplemente transmitir las definiciones de esquema como texto.

Respuesta

13

La respuesta rápida está en el SQLAlchemy 0.8 FAQ.

En SQLAlchemy 0,8 que tiene que hacer

engine = create_engine(
'mssql+pyodbc://./MyDb', 
strategy='mock', 
executor= lambda sql, *multiparams, **params: print (sql.compile(dialect=engine.dialect))) 

En SQLAlchemy 0.9 la sintaxis se simplifica.

engine = create_engine(
'mssql+pyodbc://./MyDb', 
strategy='mock', 
executor= lambda sql, *multiparams, **params: print (sql) 

La respuesta más larga es que la captura de la salida todavía tiene algunos problemas leves. Me gusta con la codificación de literales de tipos. Pero este no ha sido un problema lo suficientemente grande como para que nadie se levante y se rasque la comezón. Siempre puedes dejar que SQLAlchemy cree un archivo de base de datos y volcar el SQL desde allí.

El problema más difícil es el manejo de las migraciones de esquema. Aquí es donde SQLAlchemy-migrate puede ayudarlo.

+0

Ese enlace de preguntas frecuentes es lo que necesitaba, ¡gracias! :) No estaba buscando migraciones, como la administración de esquemas. Simplemente, necesitaba un truco simple para capturar DDL sin que se produjese un error con la salida de eco del motor. –

+0

Esto parece haber cambiado en Python 0.9. Además, las preguntas frecuentes no parecen existir para 0.9. –

+0

La segunda sintaxis no funcionó en SQLAlchemy 1.0.12 para mí; consulte https://groups.google.com/d/topic/sqlalchemy/r9neOsc64wc/discussion –

Cuestiones relacionadas