如何将 PostgreSQL 数据库中的所有 SMALLINT 列转换为 BOOLEAN?

Posted

技术标签:

【中文标题】如何将 PostgreSQL 数据库中的所有 SMALLINT 列转换为 BOOLEAN?【英文标题】:How can I convert all SMALLINT columns in PostgreSQL database to BOOLEAN? 【发布时间】:2017-10-24 17:04:39 【问题描述】:

我使用第三方工具 pgloader 将我的 Django 网站数据库从 MySQL 迁移到 PostgreSQL。但是由于 mysql 默认将 BOOLEAN 数据存储为 TINYINT(至少在 Django 中是这样),因此它在 PostgreSQL 中被转换为 SMALLINT。现在 Django 显示 smallint 被视为布尔值 的错误。因此,我想将所有 smallint 列转换为布尔值。是否有一个命令可以将单个数据库中所有表中的所有列转换为所需类型?如果我必须为每个表单独执行操作,那也可以。

编辑:

列结构:

public | smallint | default '1'::smallint

这里 public 是列名,smallint 是类型并且有它默认值为 '1'

我使用的代码:

utkarsh@utkarsh-Lenovo-G580:~$ psql -d thakurani -U utkarsh
Password for user utkarsh: 
psql (9.6.3)
Type "help" for help.

thakurani=# alter table topics_topic alter COLUMN public type boolean using(public::text::boolean);                             ERROR:  default for column "public" cannot be cast automatically to type boolean
thakurani=# alter table topics_topic alter COLUMN public type text using(public::text);
ALTER TABLE
thakurani=# alter table topics_topic alter COLUMN public type boolean using(public::boolean);
ERROR:  default for column "public" cannot be cast automatically to type boolean
thakurani=# ALTER TABLE topics_topic ALTER COLUMN public TYPE boolean USING CASE WHEN public = '0' THEN FALSE WHEN public = '1' THEN TRUE END;
ERROR:  default for column "public" cannot be cast automatically to type boolean
thakurani=# 

【问题讨论】:

您是否尝试过简单地更改模型中的类型并让migrations 完成这项工作? 【参考方案1】:

您需要双重转换 - 首先将 int 转换为文本,然后将文本转换为布尔值

这是一个例子:

t=# create table s181(i smallint default 1::smallint);
CREATE TABLE
t=# insert into s181 values (0),(1);
INSERT 0 2
t=# alter table s181 alter COLUMN i drop default;
ALTER TABLE
t=# alter table s181 alter COLUMN i type boolean using(i::text::boolean);
ALTER TABLE
t=# alter table s181 alter COLUMN i set default true;
ALTER TABLE
t=# \d s181
       Table "public.s181"
 Column |  Type   |  Modifiers
--------+---------+--------------
 i      | boolean | default true

【讨论】:

这给了我一个错误:错误:列“public”的默认值不能自动转换为布尔类型 我可以转换为文本类型,但从文本转换为布尔值会出现与以前相同的错误。 请使用现有的表结构和确切的命令更新您的帖子。 我用命令和列结构编辑了帖子。我认为由于默认值设置为“1”而出现问题。但不知道究竟是为什么。 @UtkarshGarg 已更新以适应您的情况

以上是关于如何将 PostgreSQL 数据库中的所有 SMALLINT 列转换为 BOOLEAN?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除所有表而不是 Postgresql 中的模式?

如何将 Postgresql 布尔值转换为 MySQL Tinyint?

如何将新项目附加到 PostgreSQL 中的数组类型列中

如何使用 graphql 更新集合中的所有记录

Heroku 和 Django 组合中的 Postgresql 更改与共享数据库

Postgresql 多数据库 VS 多模式