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

时间:2017-05-24 11:21:43

标签: mysql sql django database postgresql

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

修改

列结构:

public | smallint | default '1'::smallint

此处公开是列名, 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=# 

1 个答案:

答案 0 :(得分:4)

你需要双重演员 - 首先将int转换为文本,然后将文本转换为boolean

这是一个例子:

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