Quill - синтаксис INSERT INTO SELECT ...?

Поэтому я недавно перешел с ScalikeJDBC на Quill в моем проекте scala из-за поддержки async.

Есть ли поддержка любого синтаксиса SQL, подобного приведенным ниже примерам?

INSERT INTO People (id, cityID)
SELECT 52, Cities.id
FROM Cities
WHERE Cities.name = 'New York City';

INSERT INTO State (id, numCities)
SELECT 4, COUNT(*)
FROM  Cities
WHERE Cities.state = 'NY'

Ожидаемое поведение

Я бы попробовал такие вещи, как

quote {
   for {
      count <- query[City].filter(_.state == 'NY').size
   } yield query[State].insert(lift(State(4, count))
}

quote {
   query[City].filter(_.state == 'NY').size.nested.insert(count => lift(State(4, count))
}

Но это дает такие ошибки, как:

  • "карта значений не является членом Long" относительно ".size"
  • "вложенный не является членом Long" относительно ".size"

Конечно, если я сделаю что-то подобное ниже, я получу кучу ошибок:

quote {
   for {
      count <- List(query[City].filter(_.state == 'NY').size)
   } yield query[State].insert(lift(State(4, count))
}

Обходной путь

В настоящее время единственный обходной путь, похоже, заключается в выполнении двух отдельных запросов (один для получения счетчика, а второй для вставки). Однако я бы подумал, что это стало бы неэффективным, если бы я делал много вставок на основе выбора.

С необработанными запросами

Я пробовал альтернативы с использованием инфикса, такие как:

quote {
    infix"""
      INSERT INTO Languages (id,iso639_1,name)
      VALUES (
        (SELECT x2.id + 1
        FROM (SELECT id FROM Languages UNION SELECT 0) x2
        LEFT JOIN Languages x1 ON (x2.id + 1) = x1.id
        WHERE x1.id IS NULL LIMIT 1),
        'Hello',
        'World'
      );
    """.as[?]
}

Но он продолжает выдавать эти ошибки:

[error] (run-main-4a) com.github.mauricio.async.db.mysql.exceptions.MySQLException: Error 1064 - #42000 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Languages (id,iso639_1,name)
[error]       VALUES (
[error]         (SELECT x2.id ' at line 2
[error] com.github.mauricio.async.db.mysql.exceptions.MySQLException: Error 1064 - #42000 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Languages (id,iso639_1,name)
[error]       VALUES (
[error]         (SELECT x2.id ' at line 2

Это неверно, так как я скопировал и вставил необработанный SQL в браузер sql, и он работал отлично.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
635
1

Ответы 1

  final case class TestTable(id: Long, name: String)

  final val ctx = new SqlMirrorContext(MirrorSqlDialect, Literal)

  import ctx._

  final val table  = quote(query[TestTable])
  final val size   = quote(table.filter(_.name == "hello world").size)
  //the insert action
  final val insert = quote {
    (e: TestTable) => table.insert(e)
  }

// тестовое задание

//INSERT INTO TestTable (id,name) VALUES ((SELECT COUNT(*) FROM TestTable x1 WHERE x1.name = 'hello world'), '')
ctx.run(insert(TestTable(size, "")))

Большой! Спасибо, это было действительно полезно. Можете также просветить меня на первом примере? Как бы вы разрешили запрос к единственному значению, например count? Спасибо

Vangogh500 04.11.2018 00:53

у меня нет хорошей идеи для этого случая insert into ... SELECT 52, Cities.id ...; я думаю, что использование infix"<SQL>".as[Insert[TestTable]]" возможно; твоя мисс as[Insert[Table]]?

余杰水 04.11.2018 04:10

Другие вопросы по теме