gpt4 book ai didi

ruby-on-rails - Rails 测试数据库不断丢失我的 PostgreSQL 函数

转载 作者:行者123 更新时间:2023-11-29 12:09:01 25 4
gpt4 key购买 nike

我的项目使用一些自定义的 PostgreSQL 存储函数来实现一些在原始 SQL 或 ActiveRecord 中会很麻烦的功能。我时不时地运行 RSpec 测试套件,发现我所有存储的函数都被吹走了。 重新运行迁移以创建它们可以解决问题,但“rake db:structure:load”不会。

我很困惑。除非发生这种情况,否则我从不删除开发或测试数据库,但我的函数就像 Schrodinger 的 PL/pgSQL。我真的希望这永远不会发生在生产中。

这是一个失败测试的例子,我尝试修复它:

ActiveRecord::StatementInvalid:
PG::UndefinedFunction: ERROR: function round_half_down(numeric) does not exist

# Damn. We have to drop the database so we can reload structure.sql:
$ RAILS_ENV=test rake db:drop
$ RAILS_ENV=test rake db:create

# load structure.sql instead of schema.rb:
$ RAILS_ENV=test rake db:structure:load

# Not fixed:
ActiveRecord::StatementInvalid:
PG::UndefinedFunction: ERROR: function round_half_down(numeric) does not exist

$ RAILS_ENV=test rake db:migrate:redo VERSION=20160421184708
== 20171002190107 CreateRoundHalfDownFunction: reverting ======================
-- execute("DROP FUNCTION IF EXISTS round_half_down(numeric)")
-> 0.0004s
== 20171002190107 CreateRoundHalfDownFunction: reverted (0.0005s) =============

== 20171002190107 CreateRoundHalfDownFunction: migrating ======================
-- execute("CREATE OR REPLACE FUNCTION ROUND_HALF_DOWN(NUMERIC)\n RETURNS NUMERIC LANGUAGE SQL AS\n$FUNC$\n SELECT CASE WHEN ($1%1) < 0.6 THEN FLOOR($1) ELSE CEIL($1) END;\n$FUNC$\n")
-> 0.0014s
== 20171002190107 CreateRoundHalfDownFunction: migrated (0.0014s) =============

现在已经修复了!

是的,我验证了该函数存在于 structure.sql 中:

--
-- Name: round_half_down(numeric); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION round_half_down(numeric) RETURNS numeric
LANGUAGE sql
AS $_$
SELECT CASE WHEN ($1%1) < 0.6 THEN FLOOR($1) ELSE CEIL($1) END;
$_$;

最佳答案

郑重声明,使用较新版本的 pg gem 和 PostgreSQL 本身,这种情况不再发生在我身上。我还在 application.rb 中添加了 config.active_record.schema_format = :sql,因为我的应用程序大量使用了 Postgres 特定的功能和许多存储函数。

关于ruby-on-rails - Rails 测试数据库不断丢失我的 PostgreSQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com