Maison  >  Article  >  développement back-end  >  La configuration de sqlc.yaml ne remplace pas l'intervalle postgresql par time.Duration

La configuration de sqlc.yaml ne remplace pas l'intervalle postgresql par time.Duration

WBOY
WBOYavant
2024-02-09 20:09:181182parcourir

sqlc.yaml 配置不会覆盖 postgresql 时间间隔到 time.Duration

L'éditeur PHP Youzi est là pour vous présenter une question sur la configuration de sqlc.yaml. Lors de l'utilisation de postgresql, nous devons souvent utiliser un intervalle de temps (time.Duration) pour représenter une période de temps. Cependant, nous constatons parfois que la configuration de l'intervalle de temps dans le fichier de configuration sqlc.yaml ne prend pas effet, mais est remplacée par la configuration par défaut. Comment résoudre ce problème? Veuillez continuer à lire cet article et nous vous donnerons des réponses détaillées.

Contenu de la question

J'ai trouvé un problème avec l'application sqlc codegen. Juste au cas où, quand j'en aurais besoin interval (postgresql) 字段时,sqlc 会生成一个带有 int64 字段的对象。此解决方案看起来已损坏,并在扫描行时产生错误: errorf("cannot conversion %v to interval", value)

sqlc.yaml :

version: "2"
overrides:
  go:
    overrides:
      - db_type: "interval"
        engine: "postgresql"
        go_type:
          import: "time"
          package: "time"
          type: "https://pkg.go.dev/time#duration"
sql:
  - queries: "./sql_queries/raffle.query.sql"
    schema: "./migrations/001-init.sql"
    engine: "postgresql"
    gen:
     go:
        package: "raffle_repo"
        out: "../repo/sql/raffle_repo"
        sql_package: "pgx/v4"

schema.sql :

create table windowrange
(
    id        serial    primary key,
    open      timestamp not null ,
    duration  interval not null,
    created_at timestamp default now(),
    updated_at timestamp default now(),
    raffle_id integer not null
        constraint raffle_id
            references raffle
            on delete cascade
);

Modèle généré :

type Windowrange struct {
    ID        int32
    Open      time.Time
    Duration  int64
    CreatedAt sql.NullTime
    UpdatedAt sql.NullTime
    RaffleID  int32
}

Le problème a été rapidement résolu en définissant ce champ sur type time.duration. durée et le code commence à fonctionner, mais ce code est généré et ressemble à une mauvaise décision.

Lorsque j'essaie de remplacer le type via la configuration sqlc.yaml, je n'obtiens rien, l'objet est toujours en cours de création de type int64. Où ai-je commis une erreur et comment puis-je résoudre ce problème ?

Solution de contournement

Sous Types pris en charge , vous verrez pg_catalog.interval 也是 postgres 中 interval l'une des valeurs prises en charge.

Donc, si vous souhaitez simplement utiliser la partie time.duration 而不是 int64,则需要将 overrides, changez pour :

overrides:
  go:
    overrides:
      - db_type: "pg_catalog.interval"
        engine: "postgresql"
        go_type:
          import: "time"
          type: "Duration"

Conseil : Si cela ne fonctionne pas pour le type de données le plus évident, vous pouvez en essayer un autre.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer