我使用第三方工具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=#
你需要双重演员 - 首先将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