Skip to content

Unable to use query_as with Postgres enum support #313

Closed
@ecton

Description

@ecton

This example should be able to be run to create the test table, and then the unit tests will fail compilation because of the error:

the trait bound std::result::Result<std::option::Option<i32>, sqlx_core::error::Error>: sqlx::result_ext::ResultExt<std::option::Option<tests::ReprI32>> is not satisfied
the following implementations were found:
<std::result::Result<T, sqlx_core::error::Error> as sqlx::result_ext::ResultExt>
<std::result::Result<T, sqlx_core::error::Error> as sqlx::result_ext::ResultExt<std::option::Option>>
<std::result::Result<std::option::Option, sqlx_core::error::Error> as sqlx::result_ext::ResultExt>

I've also tried this with the repr(32) and the text rename functionality. I tried looking for examples in the repository, but there are no hand-written examples, just ones that use some higher-level testing functionality.

I looked for missing trait includes, but couldn't find what should be included if anything. Any help is greatly appreciated!

The cargo dependencies section for the example:

[dependencies]
sqlx = {version = "0.3", default-features=false, features=[ "runtime-tokio", "macros" , "postgres", "uuid", "chrono",  "tls" ]}
tokio = {version = "*", features = ["macros"]}
anyhow = "*"
dotenv = "*"

The main.rs file:

use sqlx::postgres::PgPool;

async fn pg() -> PgPool {
    PgPool::new("postgres://testuser:password@localhost/testdb")
        .await
        .unwrap()
}

#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
    sqlx::query("CREATE TABLE testtable(intnullcolumn INT, intnotnullcolumn INT NOT NULL, textnullcolumn TEXT, textnotnullcolumn TEXT NOT NULL)").execute(&pg().await).await?;
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::pg;
    #[derive(PartialEq, Copy, Clone, Debug, sqlx::Type)]
    #[repr(i32)]
    enum ReprI32 {
        Test = 0,
    }

    struct ReprI32OptionRow {
        value: Option<ReprI32>,
    }

    struct ReprI32Row {
        value: ReprI32,
    }

    #[tokio::test]
    async fn null_int_cast() -> Result<(), sqlx::Error> {
        sqlx::query_as!(
            ReprI32OptionRow,
            "SELECT intnullcolumn as value FROM testtable"
        )
        .fetch_one(&pg().await)
        .await
        .map(|_| ())
    }

    #[tokio::test]
    async fn not_null_int_cast() -> Result<(), sqlx::Error> {
        sqlx::query_as!(
            ReprI32Row,
            "SELECT intnotnullcolumn as value FROM testtable"
        )
        .fetch_one(&pg().await)
        .await
        .map(|_| ())
    }

    #[tokio::test]
    async fn not_null_into_option_cast() -> Result<(), sqlx::Error> {
        sqlx::query_as!(
            ReprI32OptionRow,
            "SELECT intnotnullcolumn as value FROM testtable"
        )
        .fetch_one(&pg().await)
        .await
        .map(|_| ())
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions