首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用转换迁移PostgreSQL Alter时出错

使用转换迁移PostgreSQL Alter时出错
EN

Stack Overflow用户
提问于 2013-10-25 07:59:09
回答 2查看 545关注 0票数 0

我需要为rails应用程序迁移一个PG数据库--我正在更新表的一个列的类型,从布尔到int。下面是代码:

类ChangeAdminToInt < ActiveRecord::Migration执行‘ALTER "users“ALTER列"admin”TYPE int使用("admin"::int)设置默认值"1“end

当我运行bundle exec rake db:migrate时,会得到以下错误:

错误:错误:语法错误位于或接近" SET“第5行:设置默认值"1”

但是,当我将代码切换到:

类ChangeAdminToInt

我知道错误:

错误:错误:在或接近" TYPE“第5行的语法错误:输入int使用("admin"::int)

因为问题不在于函数,而在于第5行,所以我认为数据库只是不喜欢第5行。我尝试过许多类型的语法,单引号/双引号,%q/%Q块,甚至把整个引号放在一行,但是语法错误仍然指向类型和SET默认值的前面。问题不在于改变这里发生了什么?

任何帮助都是非常感谢的。如果我错过了明显的事情,请告诉我。顺便提一下一些Gemfile:

源'https://rubygems.org‘ruby '1.9.3’宝石'rails','~> 4.0.1.rc3‘创业板’引导-sass‘,'2.3.2.0’创业板‘bcrypt’,'~> 3.1.1‘宝石'faker','1.1.2’创业板‘将分页’,'3.0.4‘创业板’引导-将_分页‘,'0.0.9’宝石'safe_attributes‘组:开发:测试做创业板'pg','0.15.1‘创业板'sqlite3’创业板‘rspec’,'2.13.1‘创业板’保护-rspec‘,'2.5.0’创业板‘s猪肉-rails’,github:‘孢krb/sporkrb’宝石‘保护-rspec’,'1.5.0‘宝石’子过程‘,'0.3.6’结束。

以及开发环境的database.yml:

开发:适配器: postgresql编码: utf8数据库: project_development池:5用户名: postgres

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-25 17:37:35

我想出来了!

这句话来自PostgreSQL网站http://www.postgresql.org/docs/8.1/static/sql-altertable.html

由于这种灵活性,使用表达式不应用于列的默认值(如果有的话);结果可能不是默认值所需的常量表达式。这意味着,当没有隐式或赋值从旧类型转换到新类型时,ALTER可能无法转换默认类型,即使提供了USING子句。在这种情况下,删除DEFAULT with,执行ALTER类型,然后使用SET default添加合适的新默认值。类似的考虑也适用于涉及该列的索引和约束。

如果我首先尝试更改类型,它就不喜欢旧的默认设置。如果我第一次设置一个新的默认设置,它不知道如何键入转换。本文指出,执行特定操作的正确方法是首先删除默认值,更改类型,然后设置新的默认值。

这是对我有用的密码。

类ChangeAdminToInt < ActiveRecord::Migration -执行%q( ALTER用户更改列admin DEFAULT,ALTER列admin类型int使用(" admin "::int),ALTER列管理集默认1;)

仅此而已!

票数 1
EN

Stack Overflow用户

发布于 2013-10-25 08:47:35

我不认为你的使用条款是正确的。这来自postgre (http://www.postgresql.org/docs/8.0/static/sql-altertable.html):

可选USING子句指定如何从旧列计算新列值;如果省略,默认转换与从旧数据类型转换为new的赋值相同。如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING子句。

所以使用它来告诉postgres如何计算新的值类型和旧的值类型。我真的不明白USING ("admin"::int)在查询中意味着什么。尝试省略使用子句或尝试如下所示:

代码语言:javascript
运行
复制
USING CASE WHEN "admin" = TRUE THEN 1 ELSE 0 END
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19584284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档