2010-10-19 6 views
9

Attualmente sto esaminando l'automazione di un processo di generazione software che include uno schema di database definito in MySQL Workbench.Creazione automazione e MySQL Workbench Scripting: Forward Engineer SQL CREATE SCRIPT

Utilizzando le funzionalità di scripting di Workbench, vorrei aprire un documento Workbench ed esportare il suo schema come uno script SQL CREATE.

Quello che mi piacerebbe sapere è se esiste una funzione che esporta l'intero schema in un unico passaggio come il file di Workbench | Export | Programmatore di inoltro SQL CREATE Script, gestisce automaticamente qualsiasi dipendenza tra le tabelle.

ho trovato alcuni candidati nel modulo DbMySQL che potrebbe fare che (generateSQL(GrtNamedObject, dict, string) e makeSQLExportScript(GrtNamedObject, dict, dict, dict)), però io sono confuso circa i parametri che si aspettano – il primo potrebbe essere l'oggetto dello schema, ma quali sono gli altri argomenti?

Qualcuno potrebbe dirmi se la mia ipotesi è corretta e/o fornirmi esempi di utilizzo?

Finora, mi è venuta in mente una soluzione manuale (notare che questo momento non ordinare le tabelle in base alle loro relazioni FK):

local o = assert(io.open("/tmp/create.sql", "wb")); 
foreach_table_all(function (t) 
    o:write(DbMySQL:makeCreateScriptForObject(t) .. ";\n\n") 
end) 
o:close() 

La questione è legata alla How to generate SQL Script from MySQL Workbench using Command Line?, tuttavia la risposta trovato che è molto astratto e non dice nulla sull'utilizzo effettivo delle funzionalità di scripting di MySQL Workbench.

risposta

3

sembra che altri linked question ottenuto answered in Dec 2013, per gentile concessione di madhead, anche se con difetti di codice banali minori, e in Python, piuttosto che Lua, ecco la versione di Python che sta lavorando per me:

# -*- coding: utf-8 -*- 
# MySQL Workbench Python script 
# <description> 
# Written in MySQL Workbench 6.0.8 

import os 
import grt 
from grt.modules import DbMySQLFE 

c = grt.root.wb.doc.physicalModels[0].catalog 
DbMySQLFE.generateSQLCreateStatements(c, c.version, { 
    'GenerateDrops' : 1, 
    'GenerateSchemaDrops' : 1, 
    'OmitSchemata' : 1, 
    'GenerateUse' : 1 
}) 
DbMySQLFE.generateSQLCreateStatements(c, c.version, {}) 
DbMySQLFE.createScriptForCatalogObjects(os.path.dirname(grt.root.wb.docPath) + '/ddl.sql', c, {}) 

sembra piuttosto grande rispetto alla variante di loop ma potrebbe portare (non ho testato, ma potrei immaginare che Workbench sia in grado di capire l'ordine corretto per creare tabelle, ecc.).

Anche io non sono sicuro se questo è esistito quando stavo facendo la domanda, ma comunque, questo funziona su una versione recente.

+1

Qualche suggerimento su quale opzione utilizzare per escludere determinate tabelle dall'esportazione, come è possibile nella GUI? – sebastian

+0

Vedere la mia domanda. Usa 'foreach_table_all()', e la funzione di callback può controllare la tabella e decidere di non scriverla. Semplice come quella. – Archimedix

+0

Un modo per eliminare l'identificatore dello schema in questo approccio? – sebastian