我使用第三方工具 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=#
答案 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