Open jamwaffles opened 4 years ago
I'm having the same issue.
@jamwaffles I might be misunderstanding, but is your table things
a single column of type item[]
? From what I can tell it has to be for this to work. If you're your table instead looks like create table things (item Item)
then you shouldn't be returning a Vec<Things>
, but Vec<Item>
.
Sorry for not being clearer in the OP. My table looks like this:
create table my_table (
id uuid primary_key,
roles varchar array,
...
);
With the matching Rust:
#[derive(
serde_derive::Deserialize, serde_derive::Serialize, PartialEq, Debug, Eq, Hash, sqlx::Type, Copy, Clone
)]
#[sqlx(rename = "varchar")]
enum Item {
Foo,
Bar,
}
#[derive(
serde_derive::Deserialize, serde_derive::Serialize, sqlx::FromRow, Hash, PartialEq, Eq, Debug, Clone
)]
struct MyThing {
id: Uuid,
roles: Vec<Item>,
// ...
}
Hope that makes things clearer!
Hi! I looked into this as it turns out it would useful for something I need. Unfortunately, it's blocked right now. The impl itself is fairly simple:
impl<T> Type<Postgres> for Vec<T>
where
T: Type<Postgres>,
{
#[inline]
fn type_info() -> PgTypeInfo {
<T as Type<Postgres>>::type_info()
}
}
But this dies because lazy normalization doesn't exist yet, (it tries to recursively resolve the trait forever)
@izik1 wouldn't your proposed implementation return type info for T
not [T]
? I think I have a work around using a newtype but the problem remains that I need a type_info for an array of T.
Using just T, for a custom type called job_stage
I get:
thread 'subsystems::storage::sql::tests::test_sql_create_workflow_with_empty_dag_creates_dag' panicked at 'called `Result::unwrap()` on an `Err` value: cannot cast type job_stage to job_stage[]
In 0.3.5 stable.
I see the workaround (that will hopefully soon not be needed anymore) isn't actually mentioned here (from https://github.com/launchbadge/sqlx/pull/1170#issuecomment-817738085):
#[derive(sqlx::Encode)]
struct Foos<'a>(&'a [Foo]);
impl sqlx::Type<sqlx::Postgres> for Foos<'_> {
fn type_info() -> PgTypeInfo {
PgTypeInfo::with_name("_foo")
}
}
query_as!(
Whatever,
"<QUERY with $1 of type foo[]>",
Foos(&foo_vec) as _,
)
@jplatte thanks for reporting here that comment. Would it also work when trying to implement sqlx::Type
on a struct? I'm trying to figure out this case and I can't map the context from your example to the following (pseudo)code:
#[derive(sqlx::Type)] // ?
struct Pet {
name: String,
age: u32
}
#[derive(sqlx::Type)]
struct Person {
name: String,
pets: Vec<Pet>
}
let _ : Vec<Person> = query_as(
"SELECT name,pets from persons"
).fetch_all(&db_pool).await.unwrap(); // ?
I would assume that also works if you change the type of the pets
field to such a wrapper type (can wrap Vec<Something>
too, doesn't have to be a slice).
That trick doesn't seem to work for Decode for me though. Any workaround there?
That trick is no longer needed, #1385 fixed it. And Decode
can't possibly work for references, maybe that's what you're hitting? Hard to tell w/o more details.
#[derive(Serialize, Deserialize)]
pub struct CartItem {
pub id: i32,
pub quantity: i32,
pub price: i32
}
#[derive(sqlx::Type, Serialize, Deserialize)]
pub struct CartItems {
pub items: Vec<CartItem>,
}
#[derive(sqlx::Type, Serialize, Deserialize)]
pub struct Voucher {
pub id: i32,
pub voucher_id: String,
pub customer_name: Option<String>,
pub customer_contact: Option<String>,
pub cart_items: CartItems,
pub time: chrono::NaiveDateTime,
pub status: bool
}
I can't get it to working.
Still not working today although it is stated in the design doc that multi dimensional data is not supported atm. I ran into trouble with Vec<(String, String)> type and other similar but more complex types, had to resort to serialising to string trick to satisfy the Encode trait
Bit of a word soup of a title, sorry :grimacing:
I'm trying to deserialize a row into a struct that holds a
Vec<Item>
, whereItem
is an enum that derivessqlx::Type
. This fails to decode, stating some trait bounds aren't satisfied. Is this a not-yet-implement feature, or am I doing something wrong/missing something in my code?Code:
The pile of derives is from our real code. Could any of them be causing issues?
Error: