1

我正在使用 play framework 2.1 并使用 evolution 为我自动生成 sql 脚本。我使用的数据库是 sqlite3。

似乎进化无法为 sqlite3 生成正确的脚本。我得到的不正确的脚本是:

create table algorithm (

id                        bigint AUTOINCREMENT primary key,

name                      varchar(255),

description               varchar(255))

;

我是 sqlite3 的新手。通过网上搜索,我意识到:

  1. autoincrement只能与Integer
  2. autoincrement应该放在后面primary key

所以显然自动生成的脚本是不正确的。我的问题是:

  1. 有没有办法解决上述问题,以便我仍然可以使用 sqlite3 的进化?
  2. 一般来说,您建议使用进化还是禁用它并手动编写 sql 脚本?
4

1 回答 1

1

我昨天遇到了同样的问题。问题位于 ebean 框架的 sqlite ddl 配置内部。

但是,我能够通过创建自己的 com.avaje.ebean.config.dbplatform.SQLitePlatform 类的实现来解决这个问题。这是一个快速的技巧,它将 autoincrement 关键字设置为空字符串并将 bigint 类型重新定义为整数:

package com.avaje.ebean.config.dbplatform;

import java.sql.Types;

import javax.sql.DataSource;

import com.avaje.ebean.BackgroundExecutor;

public class SQLitePlatform extends DatabasePlatform {

    static {
        System.err.println("\n\n!!! Custom SQLitePlatform class for ebean ORM loaded !!!!\n\n");
    }

    public SQLitePlatform() {
        super();
        this.name = "sqlite";

        this.dbIdentity.setIdType(IdType.IDENTITY);
        this.dbIdentity.setSupportsGetGeneratedKeys(false);
        this.dbIdentity
                .setSelectLastInsertedIdTemplate("select last_insert_rowid()");
        this.openQuote = "\"";
        this.closeQuote = "\"";

        this.booleanDbType = Types.INTEGER;

        dbTypeMap.put(Types.BIT, new DbType("int default 0"));
        dbTypeMap.put(Types.BOOLEAN, new DbType("int default 0"));
        dbTypeMap.put(Types.BIGINT, new DbType("integer"));

        dbDdlSyntax.setInlinePrimaryKeyConstraint(true);
        dbDdlSyntax.setIdentity("");
        dbDdlSyntax.setDisableReferentialIntegrity("PRAGMA foreign_keys = OFF");
        dbDdlSyntax.setEnableReferentialIntegrity("PRAGMA foreign_keys = ON");
    }

    /**
     * Return null in case there is a sequence annotation.
     */
    @Override
    public IdGenerator createSequenceIdGenerator(BackgroundExecutor be,
            DataSource ds, String seqName, int batchSize) {

        return null;
    }

}

将类编译并打包成一个 jar 文件。当放置在lib您的播放应用程序的目录中时,类加载器将在原始实现之前加载该类,并且 sqlite 应该接受此自定义实现生成的 ddl。

于 2013-04-30T13:26:58.987 回答