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

问题描述 投票:2回答:1

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

编辑:

列结构:

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=# 
mysql sql django database postgresql
1个回答
4
投票

你需要双重演员 - 首先将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
© www.soinside.com 2019 - 2024. All rights reserved.