This repo is a test repo for a problem I stumbled upon while using rust sqlx.
Create a postgres database and run the commands from database.sql
to create the schema and test data. Remove ´.example´ from ´.env.example´ and adjust the database url to your needs.
When trying to query all persons with their coresponding languages as such:
let persons = sqlx::query_as::<_, Person>(
r#"
SELECT
P.id, P.name, P.age, P.isActive,
ARRAY_AGG((L.id, L.name)) AS "language"
FROM person P
JOIN language L on P.id = L.PERSON_id
group by P.id, P.name, P.age, P.isActive;
"#
)
.fetch_one(&pool)
.await?;
println!("{:?}", persons);
I get the following error:
Error: ColumnDecode { index: "\"language\"", source: "mismatched types; Rust type `alloc::vec::Vec<sqlx_test::entities::language::Language>` (as SQL type `_language`) is not compatible with SQL type `RECORD[]`" }
error: process didn't exit successfully: `target\debug\sqlx-test.exe` (exit code: 1)
I had to the following piece of code because otherwise I get a PgHasArrayType error:
impl sqlx::postgres::PgHasArrayType for Language {
fn array_type_info() -> sqlx::postgres::PgTypeInfo {
// Array type name is the name of the element type prefixed with `_`.
sqlx::postgres::PgTypeInfo::with_name("_language")
}
}
However when I use the following query no error happens and the PgHasArrayType
isn't even needed.
let persons = sqlx::query_as!(Person,
r#"
SELECT
P.id, P.name, P.age, P.isActive,
ARRAY_AGG((L.id, L.name)) AS "language: Vec<Language>"
FROM person P
JOIN language L on P.id = L.PERSON_id
group by P.id, P.name, P.age, P.isActive;
"#
)
.fetch_all(&pool)
.await?;
println!("{:?}", persons);
Why does this implementation of the query works while I can't get the previous working?