Rake Limited Table Creation

I would like to use the Grails function to create / update database tables on a limited basis. In particular, I would like Grails to manage some tables, but not all.

Is there a way to limit Grails-managed tables, or is this all or nothing?

+4
source share
2 answers

In general, this is all or nothing, as Grails uses the Hibernate HBM2DDL functionality. But you can intercept the process using a special configuration subclass. Here is an example that extends GrailsAnnotationConfiguration and overrides all three SQL generation methods:

package com.yourcompany.yourapp; import java.util.ArrayList; import java.util.List; import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration; import org.hibernate.HibernateException; import org.hibernate.dialect.Dialect; import org.hibernate.tool.hbm2ddl.DatabaseMetadata; public class MyConfiguration extends GrailsAnnotationConfiguration { private static final String[] IGNORE_NAMES = { "foo", "bar" }; @Override public String[] generateDropSchemaScript(Dialect dialect) throws HibernateException { return prune(super.generateDropSchemaScript(dialect)); } @Override public String[] generateSchemaCreationScript(Dialect dialect) throws HibernateException { return prune(super.generateSchemaCreationScript(dialect)); } @Override public String[] generateSchemaUpdateScript(Dialect dialect, DatabaseMetadata databaseMetadata) throws HibernateException { return prune(super.generateSchemaUpdateScript(dialect, databaseMetadata)); } private String[] prune(String[] script) { List<String> pruned = new ArrayList<String>(); for (String command : script) { for (String ignoreName : IGNORE_NAMES) { if (!command.toLowerCase().contains(" table " + ignoreName + " ")) { pruned.add(command); } } } return pruned.toArray(new String[pruned.size()]); } } 

You do not need to redefine all three, for example. You can allow the creation but removal of updates.

This is logged in grails-app / conf / DataSource.groovy:

 dataSource { pooled = true driverClassName = ... username = ... password = ... configClass = com.yourcompany.yourapp.MyConfiguration } 

Note that the class must be written in Java due to a problem with private methods in the base class, when faced with methods that Groovy adds to all Groovy classes.

+11
source

Thanks for fixing Steve. I am posting the patch above but formatted for stackoverflow. When I first tried this, I missed the fact that the original if ( ! command.toLowerCase()...) reverse logic in the fix is ​​like if (command.toLowerCase()...) , which actually made it look like dbCreate = "create-drop" in my /DataSource.groovy configuration had no effect. I even worked from the HTML source from this page to see the alleged line breaks, but still missed this vital bit of logic :-( As soon as I entered it correctly, it worked fine.

 private String[] prune(String[] script) { List<String> pruned = new ArrayList<String>(); for (String command : script) { boolean ignore = false; for (String ignoreName : IGNORE_NAMES) { if (command.toLowerCase().contains(" table " + ignoreName.toLowerCase() + " ")) { ignore = true; break; } } if (!ignore) { pruned.add(command); } } return pruned.toArray(new String[pruned.size()]); } 
+2
source

All Articles