Skip to content

ToSql for NewType structs? #311

Closed
Closed
@purew

Description

@purew

How would one work with new-type structs and ToSql?

See the following example where I'm trying to use pub struct Id(i32):

#[macro_use]
extern crate postgres;
#[macro_use]
extern crate postgres_derive;

use postgres::{Connection, TlsMode};

#[derive(ToSql, FromSql, Debug)]
pub struct Id(pub i32);

#[derive(Debug, ToSql, FromSql)]
#[postgres(name = "person")]
struct Person {
    id: Id,
    name: String,
}

fn main() {
    let conn = Connection::connect(
        "postgres://postgres:pw@localhost:5432/postgres",
        TlsMode::None,
    ).unwrap();

    conn.execute("DROP SCHEMA p CASCADE", &[]);
    conn.execute("CREATE  SCHEMA p", &[]);
    conn.execute(
        "CREATE TYPE p.person AS (
                    id              INT,
                    name            TEXT
                  )",
        &[],
    ).unwrap();
    conn.execute(
        "CREATE TABLE p.persons (
                    id              SERIAL PRIMARY KEY,
                    person          p.person
                  )",
        &[],
    ).unwrap();
    let me = Person {
        id: Id(0),
        //id: 0,
        name: "Steven".to_string(),
    };
    println!("Trying to insert {:?}", me);
    conn.execute("INSERT INTO p.persons (person) VALUES ($1)", &[&me])
        .unwrap();
    for row in &conn.query("SELECT person FROM p.persons", &[]).unwrap() {
        let person: Person = row.get_opt(0).unwrap().unwrap();
        println!("Found person {}", person.name);
    }
}
     Running `target/debug/postgres-new-type-example`
Trying to insert Person { id: Id(0), name: "Steven" }
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(Conversion(WrongType(Type(Other(Other { name: "person", oid: 18910, kind: Composite([Field { name: "id", type_:
Type(Int4) }, Field { name: "name", type_: Type(Text) }]), schema: "p" })))))', /checkout/src/libcore/result.rs:906:4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions