Конкатенация баз данных с помощью Squeryl - PullRequest
1 голос
/ 15 ноября 2011

Я пытаюсь использовать Squeryl, чтобы взять содержимое таблицы из одной базы данных и добавить ее к эквивалентной таблице в другой базе данных.Первичный ключ должен быть переназначен в процессе, но я получаю ошибку NULL не допускается для столбца "SIMID" .Почему это так?

object Concatenator {
  def main(args: Array[String]) {
    Class.forName("org.h2.Driver");

    val seshA = Session.create(
      java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsA", "sa", "password"),
      new H2Adapter
    )

    val seshB = Session.create(
      java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsB", "sa", "password"),
      new H2Adapter
    )

    using(seshA){
      import Library._
      from(sims){s => select(s)}.foreach{item =>
        using(seshB){
          sims.insert(item);
        }
      }
    }

  }

  case class Simulation(
    @Column("SIMID")
    var id: Long, 
    val date: Date
  ) extends KeyedEntity[Long]

  object Library extends Schema {
    val sims = table[Simulation]

    on(sims)(s => declare(
      s.id is(unique, indexed, autoIncremented)
    ))
  }
}

Обновление: Я думаю, что это может быть связано с БД.Они были созданы в проекте Java с использованием JPA / EclipseLink, и в дополнение к созданию таблиц для моих сущностей он также создал таблицу с именем SEQUENCE, предположительно для генерации первичного ключа.

Я обнаружил, что могу создать новую таблицу в Squeryl и вручную поместить в нее содержимое обеих баз данных, достигая, таким образом, того же эффекта.Интересно, что у этой новой таблицы не было автоматически сгенерированной таблицы SEQUENCE.Итак, я предполагаю, что все сводится к тому, как JPA / EclipseLink генерировал мои первичные ключи?

Обновление 2: По запросу я добавил trace_level_file = 3 к URL-адресу, и файлы находятся здесь: resultsA.trace.db и resultsB.trace.db .Я думаю, что B более интересный.Кроме того, я поместил упрощенную версию базы данных здесь , в которой удалены ненужные таблицы (та же база данных используется для результатов A и результатов B).

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Просто есть момент, чтобы взглянуть на это более внимательно. Оказывается, вы были на правильном пути. Хотя я предполагаю, что EclipseLink использует Sequence для генерации значения PK, Squeryl определяет столбец как-то так:

simid bigint, не нулевой первичный ключ auto_increment

Без флага auto_increment значение никогда не помещается в столбец, и вы в конечном итоге нарушаете указанное выше ограничение. Похоже, вы уже работали над этой проблемой, но, надеюсь, это поможет вам или кому-то еще в будущем.

0 голосов
/ 23 ноября 2011

Не совсем решение, но мой обходной путь - создать новую базу данных

val seshNew = Session.create(java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsNew", "sa","password"),new H2Adapter)

, а затем просто записать в него все данные из других баз данных

using(seshNew){
    sims.insert(new Simulation(0,item.date))
}

Первичные ключи 0 перезаписываются соответствующим образом.

...