I am trying to insert a record into Postgresql using sea-orm. I have enabled sqlx-logging to see why the insertion is crashing. Here is what I find.
[2024-08-03T07:33:35Z DEBUG sea_orm::driver::sqlx_postgres] INSERT INTO "customers" ("email", "status", "linked_acc_name", "acc_manager_name", "acc_manager_email", "acc_manager_contact_no", "created_by", "created_on", "updated_by", "updated_on") VALUES ('[email protected]', CAST('guest' AS CustomerStatus), NULL, NULL, NULL, NULL, 'a48c7582-3cac-4249-924d-5fe93b8f345a', '2024-08-03 07:33:35', 'a48c7582-3cac-4249-924d-5fe93b8f345a', '2024-08-03 07:33:35') RETURNING "id", "email", CAST("status" AS text), "linked_acc_name", "acc_manager_name", "acc_manager_email", "acc_manager_contact_no", "created_by", "created_on", "updated_by", "updated_on"
[2024-08-03T07:33:35Z INFO sqlx::query] summary="INSERT INTO "customers" ("email", …" db.statement="nnINSERT INTOn "customers" (n "email",n "status",n "linked_acc_name",n "acc_manager_name",n "acc_manager_email",n "acc_manager_contact_no",n "created_by",n "created_on",n "updated_by",n "updated_on"n )nVALUESn (n $1,n CAST($2 AS CustomerStatus),n $3,n $4,n $5,n $6,n $7,n $8,n $9,n $10n ) RETURNING "id",n "email",n CAST("status" AS text),n "linked_acc_name",n "acc_manager_name",n "acc_manager_email",n "acc_manager_contact_no",n "created_by",n "created_on",n "updated_by",n "updated_on"n" rows_affected=0 rows_returned=0 elapsed=594.438µs elapsed_secs=0.000594438
thread 'tokio-runtime-worker' panicked at src/handlers/users/signup.rs:56:47:
called `Result::unwrap()` on an `Err` value: Query(SqlxError(Database(PgDatabaseError { severity: Error, code: "42704", message: "type "customerstatus" does not exist", detail: None, hint: None, position: Some(Original(210)), where: None, schema: None, table: None, column: None, data_type: None, constraint: None, file: Some("parse_type.c"), line: Some(270), routine: Some("typenameType") })))
stack backtrace:
The insertion statement contains a Cast clause, which is causing it to fail, when it doesn’t find the enum type (actually, the enum type very much exists).
To cross check, I have run a query to find all enum types available. Here is the result.
SELECT n.nspname AS schema, t.typname AS enum_name
FROM pg_type t
JOIN pg_enum e ON t.oid = e.enumtypid
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
GROUP BY schema, enum_name;
schema | enum_name
--------+---------------------
public | WorkflowStatus
public | DeploymentJobStatus
public | CustomerStatus
public | DatasetPurpose
public | TrainingStatus
public | DeploymentStatus
public | TrainingParamType
(7 rows)
The insertion seems to work, when we don’t have the ‘Cast(…)’ function included. What is going wrong here, and why does Sea-orm have to generate code that doesn’t work?