hbase - как изменить структуру таблиц без удаления таблиц - PullRequest
0 голосов
/ 02 сентября 2011

я использую плагин grails-1.3.2 и gorm-hbase-0.2.4 .

Иногда мне нужно изменить структуру таблиц (добавить новые таблицы или столбцы). Я создал таблицу автомобилей:

class Car{
    static belongsTo = [user:User]

    String color
    String model
    //.....

    static constraints = {
    }
}

но когда я хочу создать объект автомобиля:

def create = {
        Car car = new Car()
        car.properties = params
        car.save(flush: true)        
 }

Я получил следующее исключение:

ERROR gorm.SavePersistentMethod  - APP_CAR
org.apache.hadoop.hbase.TableNotFoundException: APP_CAR

После того, как я запустил приложение с create-drop, everithing начинает работать хорошо .. но я не могу после каждого изменения удалить все данные, я думал, что плагин должен делать все обновления

Итак, я смотрю каким-то образом после того, как структура таблиц changind продолжает запускать приложение без удаления таблиц.

Если кто-нибудь знает решение, пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Grails НЕ будет выполнять автоматическое обновление ваших таблиц, что если он автоматически удалит столбец в производственной среде? Может быть, это не то, что вы хотели.

Для этого существует плагин переноса базы данных, и вот отличная ссылка , которая это объясняет. Обратите внимание, что вам нужно использовать grails prod вместо тех, которые прямо указаны в ссылке, в противном случае он будет работать только в режиме разработки. Ссылка не показывает prod в своих командах.

Официальные ссылки здесь , а блог источника весны об этом здесь .

0 голосов
/ 10 сентября 2011

плагин переноса базы данных не будет работать, потому что он работает только с Hibernate.Вам нужно внести некоторые изменения в исходный код плагина.HBasePluginSupport.grovy

static doWithApplicationContext = {ApplicationContext applicationContext ->
    LOG.debug("Closure HBasePluginSupport.doWithApplicationContext{} invoked with arg $applicationContext")

    assert !PluginManagerHolder.getPluginManager().hasGrailsPlugin("hibernate"),"hibernate plug-in conflicts with gorm-hbase plug-in"

    // Read data source configuration, setting defaults as required
    def dataSource = application.config.dataSource
    // TODO write tests for this <--- Even maybe figure out if this is ever invoked
    if (!dataSource) dataSource = new HBaseDefaults()

    def dbCreate = dataSource?.dbCreate
    if (!dbCreate) dbCreate = "create-drop"
    LOG.debug("Data Source configured with dbCreate set to $dbCreate")

    // TODO Complete dbCreate related processing
    if (dbCreate?.toUpperCase()?.equals("CREATE-DROP")) {
        def createIndexedTables = dataSource?.indexed
        LOG.debug ("Flag createIndexedTables set to $createIndexedTables")
        def tableManager = HBaseLookupUtils.getBean("hbase.table.manager")

        tableManager.createSequenceTable()
        tableManager.createReferenceTable()

        application.domainClasses.each {domainClass ->
            LOG.debug("Adding table for Domain Class $domainClass")
            tableManager.createDomainTable(domainClass, createIndexedTables)
        }

        LOG.debug("List of all store found :")
        tableManager.getTableNames().each {tn ->
            LOG.debug("- $tn")
        }
    } else if (dbCreate?.toUpperCase()?.equals("UPDATE")) {
        def createIndexedTables = dataSource?.indexed
        def tableManager = HBaseLookupUtils.getBean("hbase.table.manager")
        def existingTables = tableManager.getTableNames();

        application.domainClasses.each {domainClass ->
            LOG.debug("Domain Class $domainClass")
            def tableDesc = new HTableDescriptor(HBaseNameUtils.getDomainTableName(domainClass))
            if (!existingTables.contains(tableDesc.getNameAsString())) {
                tableManager.createDomainTable(domainClass, createIndexedTables)
                LOG.debug("Adding table for Domain Class $domainClass")
            }
        }
    }

    application.domainClasses.each {domainClass ->
        LOG.debug("Adding dbms related methods to Domain Class $domainClass")
        def domainClassManager = new HBaseDomainClassManager()
        domainClassManager.createQueryMethods(domainClass)
        domainClassManager.createPersistenceMethods(domainClass)
        domainClassManager.addLazyLoadingSupport(domainClass)
        domainClassManager.addDynamicFinders(domainClass)
    }
}
...