1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-06 17:41:00 +00:00

perf(database): marginally speeds migrations up

PostgreSQL allows table alterations to be done in a single query, so let's take
advantage of it. This should marginally speed the CI up.
This commit is contained in:
jvoisin 2025-06-15 21:26:38 +02:00
parent b95c9023ee
commit 5fbd278e9f

View file

@ -211,12 +211,13 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN wallabag_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN wallabag_url text default ''; ADD COLUMN wallabag_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN wallabag_client_id text default ''; ADD COLUMN wallabag_url text default '',
ALTER TABLE integrations ADD COLUMN wallabag_client_secret text default ''; ADD COLUMN wallabag_client_id text default '',
ALTER TABLE integrations ADD COLUMN wallabag_username text default ''; ADD COLUMN wallabag_client_secret text default '',
ALTER TABLE integrations ADD COLUMN wallabag_password text default ''; ADD COLUMN wallabag_username text default '',
ADD COLUMN wallabag_password text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -236,9 +237,10 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN nunux_keeper_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN nunux_keeper_url text default ''; ADD COLUMN nunux_keeper_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN nunux_keeper_api_key text default ''; ADD COLUMN nunux_keeper_url text default '',
ADD COLUMN nunux_keeper_api_key text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -255,9 +257,10 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN pocket_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN pocket_access_token text default ''; ADD COLUMN pocket_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN pocket_consumer_key text default ''; ADD COLUMN pocket_access_token text default '',
ADD COLUMN pocket_consumer_key text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -271,8 +274,9 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE feeds ADD COLUMN username text default ''; ALTER TABLE feeds
ALTER TABLE feeds ADD COLUMN password text default ''; ADD COLUMN username text default '',
ADD COLUMN password text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -558,9 +562,10 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN telegram_bot_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN telegram_bot_token text default ''; ADD COLUMN telegram_bot_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN telegram_bot_chat_id text default ''; ADD COLUMN telegram_bot_token text default '',
ADD COLUMN telegram_bot_chat_id text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -575,28 +580,31 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN googlereader_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN googlereader_username text default ''; ADD COLUMN googlereader_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN googlereader_password text default ''; ADD COLUMN googlereader_username text default '',
ADD COLUMN googlereader_password text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN espial_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN espial_url text default ''; ADD COLUMN espial_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN espial_api_key text default ''; ADD COLUMN espial_url text default '',
ALTER TABLE integrations ADD COLUMN espial_tags text default 'miniflux'; ADD COLUMN espial_api_key text default '',
ADD COLUMN espial_tags text default 'miniflux';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN linkding_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN linkding_url text default ''; ADD COLUMN linkding_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN linkding_api_key text default ''; ADD COLUMN linkding_url text default '',
ADD COLUMN linkding_api_key text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -609,8 +617,9 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
_, err = tx.Exec(` _, err = tx.Exec(`
ALTER TABLE users ADD COLUMN default_reading_speed int default 265; ALTER TABLE users
ALTER TABLE users ADD COLUMN cjk_reading_speed int default 500; ADD COLUMN default_reading_speed int default 265,
ADD COLUMN cjk_reading_speed int default 500;
`) `)
return return
}, },
@ -634,11 +643,12 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN matrix_bot_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN matrix_bot_user text default ''; ADD COLUMN matrix_bot_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN matrix_bot_password text default ''; ADD COLUMN matrix_bot_user text default '',
ALTER TABLE integrations ADD COLUMN matrix_bot_url text default ''; ADD COLUMN matrix_bot_password text default '',
ALTER TABLE integrations ADD COLUMN matrix_bot_chat_id text default ''; ADD COLUMN matrix_bot_url text default '',
ADD COLUMN matrix_bot_chat_id text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return return
@ -657,8 +667,9 @@ var migrations = []func(tx *sql.Tx, driver string) error{
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE users RENAME double_tap TO gesture_nav; ALTER TABLE users RENAME double_tap TO gesture_nav;
ALTER TABLE users ALTER COLUMN gesture_nav SET DATA TYPE text using case when gesture_nav = true then 'tap' when gesture_nav = false then 'none' end; ALTER TABLE users
ALTER TABLE users ALTER COLUMN gesture_nav SET default 'tap'; ALTER COLUMN gesture_nav SET DATA TYPE text using case when gesture_nav = true then 'tap' when gesture_nav = false then 'none' end,
ALTER COLUMN gesture_nav SET default 'tap';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -720,45 +731,50 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN notion_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN notion_token text default ''; ADD COLUMN notion_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN notion_page_id text default ''; ADD COLUMN notion_token text default '',
ADD COLUMN notion_page_id text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN readwise_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN readwise_api_key text default ''; ADD COLUMN readwise_enabled bool default 'f',
ADD COLUMN readwise_api_key text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN apprise_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN apprise_url text default ''; ADD COLUMN apprise_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN apprise_services_url text default ''; ADD COLUMN apprise_url text default '',
ADD COLUMN apprise_services_url text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN shiori_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN shiori_url text default ''; ADD COLUMN shiori_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN shiori_username text default ''; ADD COLUMN shiori_url text default '',
ALTER TABLE integrations ADD COLUMN shiori_password text default ''; ADD COLUMN shiori_username text default '',
ADD COLUMN shiori_password text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN shaarli_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN shaarli_url text default ''; ADD COLUMN shaarli_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN shaarli_api_secret text default ''; ADD COLUMN shaarli_url text default '',
ADD COLUMN shaarli_api_secret text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -771,18 +787,20 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN webhook_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN webhook_url text default ''; ADD COLUMN webhook_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN webhook_secret text default ''; ADD COLUMN webhook_url text default '',
ADD COLUMN webhook_secret text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN telegram_bot_topic_id int; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN telegram_bot_disable_web_page_preview bool default 'f'; ADD COLUMN telegram_bot_topic_id int,
ALTER TABLE integrations ADD COLUMN telegram_bot_disable_notification bool default 'f'; ADD COLUMN telegram_bot_disable_web_page_preview bool default 'f',
ADD COLUMN telegram_bot_disable_notification bool default 'f';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -812,8 +830,9 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN rssbridge_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN rssbridge_url text default ''; ADD COLUMN rssbridge_enabled bool default 'f',
ADD COLUMN rssbridge_url text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return return
@ -838,41 +857,45 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN omnivore_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN omnivore_api_key text default ''; ADD COLUMN omnivore_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN omnivore_url text default ''; ADD COLUMN omnivore_api_key text default '',
ADD COLUMN omnivore_url text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return return
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN linkace_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN linkace_url text default ''; ADD COLUMN linkace_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN linkace_api_key text default ''; ADD COLUMN linkace_url text default '',
ALTER TABLE integrations ADD COLUMN linkace_tags text default ''; ADD COLUMN linkace_api_key text default '',
ALTER TABLE integrations ADD COLUMN linkace_is_private bool default 't'; ADD COLUMN linkace_tags text default '',
ALTER TABLE integrations ADD COLUMN linkace_check_disabled bool default 't'; ADD COLUMN linkace_is_private bool default 't',
ADD COLUMN linkace_check_disabled bool default 't';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN linkwarden_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN linkwarden_url text default ''; ADD COLUMN linkwarden_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN linkwarden_api_key text default ''; ADD COLUMN linkwarden_url text default '',
ADD COLUMN linkwarden_api_key text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN readeck_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN readeck_only_url bool default 'f'; ADD COLUMN readeck_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN readeck_url text default ''; ADD COLUMN readeck_only_url bool default 'f',
ALTER TABLE integrations ADD COLUMN readeck_api_key text default ''; ADD COLUMN readeck_url text default '',
ALTER TABLE integrations ADD COLUMN readeck_labels text default ''; ADD COLUMN readeck_api_key text default '',
ADD COLUMN readeck_labels text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -901,10 +924,11 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN raindrop_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN raindrop_token text default ''; ADD COLUMN raindrop_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN raindrop_collection_id text default ''; ADD COLUMN raindrop_token text default '',
ALTER TABLE integrations ADD COLUMN raindrop_tags text default ''; ADD COLUMN raindrop_collection_id text default '',
ADD COLUMN raindrop_tags text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -925,25 +949,28 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN betula_url text default ''; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN betula_token text default ''; ADD COLUMN betula_url text default '',
ALTER TABLE integrations ADD COLUMN betula_enabled bool default 'f'; ADD COLUMN betula_token text default '',
ADD COLUMN betula_enabled bool default 'f';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN ntfy_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN ntfy_url text default ''; ADD COLUMN ntfy_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN ntfy_topic text default ''; ADD COLUMN ntfy_url text default '',
ALTER TABLE integrations ADD COLUMN ntfy_api_token text default ''; ADD COLUMN ntfy_topic text default '',
ALTER TABLE integrations ADD COLUMN ntfy_username text default ''; ADD COLUMN ntfy_api_token text default '',
ALTER TABLE integrations ADD COLUMN ntfy_password text default ''; ADD COLUMN ntfy_username text default '',
ALTER TABLE integrations ADD COLUMN ntfy_icon_url text default ''; ADD COLUMN ntfy_password text default '',
ADD COLUMN ntfy_icon_url text default '';
ALTER TABLE feeds ADD COLUMN ntfy_enabled bool default 'f'; ALTER TABLE feeds
ALTER TABLE feeds ADD COLUMN ntfy_priority int default '3'; ADD COLUMN ntfy_enabled bool default 'f',
ADD COLUMN ntfy_priority int default '3';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -965,16 +992,18 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN cubox_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN cubox_api_link text default ''; ADD COLUMN cubox_enabled bool default 'f',
ADD COLUMN cubox_api_link text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN discord_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN discord_webhook_link text default ''; ADD COLUMN discord_enabled bool default 'f',
ADD COLUMN discord_webhook_link text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -986,8 +1015,9 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN slack_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN slack_webhook_link text default ''; ADD COLUMN slack_enabled bool default 'f',
ADD COLUMN slack_webhook_link text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -998,14 +1028,16 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN pushover_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN pushover_user text default ''; ADD COLUMN pushover_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN pushover_token text default ''; ADD COLUMN pushover_user text default '',
ALTER TABLE integrations ADD COLUMN pushover_device text default ''; ADD COLUMN pushover_token text default '',
ALTER TABLE integrations ADD COLUMN pushover_prefix text default ''; ADD COLUMN pushover_device text default '',
ADD COLUMN pushover_prefix text default '';
ALTER TABLE feeds ADD COLUMN pushover_enabled bool default 'f'; ALTER TABLE feeds
ALTER TABLE feeds ADD COLUMN pushover_priority int default '0'; ADD COLUMN pushover_enabled bool default 'f',
ADD COLUMN pushover_priority int default '0';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
@ -1071,7 +1103,7 @@ var migrations = []func(tx *sql.Tx, driver string) error{
ALTER TABLE integrations ADD COLUMN rssbridge_token text default ''; ALTER TABLE integrations ADD COLUMN rssbridge_token text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
_, err = tx.Exec(`ALTER TABLE users ADD COLUMN always_open_external_links bool default 'f'`) _, err = tx.Exec(`ALTER TABLE users ADD COLUMN always_open_external_links bool default 'f'`)
@ -1079,12 +1111,13 @@ var migrations = []func(tx *sql.Tx, driver string) error{
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
sql := ` sql := `
ALTER TABLE integrations ADD COLUMN karakeep_enabled bool default 'f'; ALTER TABLE integrations
ALTER TABLE integrations ADD COLUMN karakeep_api_key text default ''; ADD COLUMN karakeep_enabled bool default 'f',
ALTER TABLE integrations ADD COLUMN karakeep_url text default ''; ADD COLUMN karakeep_api_key text default '',
ADD COLUMN karakeep_url text default '';
` `
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return return err
}, },
func(tx *sql.Tx, _ string) (err error) { func(tx *sql.Tx, _ string) (err error) {
_, err = tx.Exec(`ALTER TABLE users ADD COLUMN open_external_links_in_new_tab bool default 't'`) _, err = tx.Exec(`ALTER TABLE users ADD COLUMN open_external_links_in_new_tab bool default 't'`)