Поэтому я недавно перешел с 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))
}
Но это дает такие ошибки, как:
Конечно, если я сделаю что-то подобное ниже, я получу кучу ошибок:
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, и он работал отлично.






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, "")))
у меня нет хорошей идеи для этого случая insert into ... SELECT 52, Cities.id ...; я думаю, что использование infix"<SQL>".as[Insert[TestTable]]" возможно; твоя мисс as[Insert[Table]]?
Большой! Спасибо, это было действительно полезно. Можете также просветить меня на первом примере? Как бы вы разрешили запрос к единственному значению, например count? Спасибо