Skip to content

ERROR: column \"sqlair_0\" does not exist (SQLSTATE 42703) when using sqlair with postgres #189

@gruyaume

Description

@gruyaume

Overview

Hello, I have been using sqlair with sqlite quite a bit and I'm trying to use it with postgres using the pgx driver. I am not able to write data to the database using sqlair. I consistently get the following error: ERROR: column \"sqlair_0\" does not exist (SQLSTATE 42703). Am I doing something wrong? Is sqlair not supporting pgx/postgres? Some help here would be welcome.

Example Code

package db

import (
	"context"
	"database/sql"
	"fmt"

	"github.com/canonical/sqlair"
	_ "github.com/jackc/pgx/v5/stdlib"
)

type Database struct {
	conn *sqlair.DB
}

type Config struct {
	Host     string
	Port     int
	User     string
	Password string
	DBName   string
}

func New(config *Config) (*Database, error) {
	connString := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", config.Host, config.Port, config.User, config.Password, config.DBName)

	sqlConnection, err := sql.Open("pgx", connString)
	if err != nil {
		return nil, err
	}

	_, err = sqlConnection.Exec(fmt.Sprintf(QueryCreateNewsletterSubscribersTable, NewsletterSubscribersTableName))
	if err != nil {
		_ = sqlConnection.Close()
		return nil, fmt.Errorf("unable to create newsletter subscribers table: %w", err)
	}

	if _, err := sqlConnection.Exec(fmt.Sprintf(QueryCreateUsersTable, UsersTableName)); err != nil {
		return nil, err
	}

	return &Database{
		conn: sqlair.NewDB(sqlConnection),
	}, nil
}

func (db *Database) Close() error {
	if db.conn == nil {
		return nil
	}

	return db.conn.PlainDB().Close()
}

const NewsletterSubscribersTableName = "newsletter_subscribers"

const QueryCreateNewsletterSubscribersTable = `CREATE TABLE IF NOT EXISTS %s (
     id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
     email TEXT NOT NULL UNIQUE,
     status TEXT NOT NULL DEFAULT 'pending'
   );`

const (
	createNewsletterSubscriberStmt = "INSERT INTO %s (email, status) VALUES ($NewsletterSubscriber.email, $NewsletterSubscriber.status)"
)

type NewsletterSubscriber struct {
	ID     int64  `db:"id"`
	Email  string `db:"email"`
	Status string `db:"status"`
}

func (db *Database) CreateNewsletterSubscriber(ctx context.Context, email string) error {
	stmt := fmt.Sprintf(createNewsletterSubscriberStmt, tbl(NewsletterSubscribersTableName))
	q, err := sqlair.Prepare(stmt, NewsletterSubscriber{})
	if err != nil {
		return err
	}

	ns := NewsletterSubscriber{Email: email}
	return db.conn.Query(ctx, q, ns).Run()
}
guillaume@courge:~/code/ellanetworks.com$ go run cmd/ellanetworks/main.go  --config config.yaml 
2025-08-21T09:47:13-04:00       fatal   ellanetworks/main.go:47 Couldn't create newsletter subscriber   {"component": "Ella", "error": "ERROR: column \"sqlair_0\" does not exist (SQLSTATE 42703)"}
exit status 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions