ActiveRecord::Migration.maintain_test_schema!

这篇具有很好参考价值的文章主要介绍了ActiveRecord::Migration.maintain_test_schema!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试gem: rspec-rails

问题描述

在使用 rspec-rails 进行测试时,出现了以下错误

ActiveRecord::StatementInvalid: UndefinedFunction: ERROR: function init_id() does not exist

这个错误与数据库架构有关。

schema.rb中

create_table "users", id: :string, default: -> { "init_id()" }, force: :cascade do |t|

解决办法

为了解决这个问题,你需要在 config/environments/test.rb 文件中添加以下配置:

config.active_record.schema_format = :sql

这会将数据库架构格式更改为 SQL 格式,以避免出现错误。

问题原因

这个问题的根本原因在于,在运行RSpec测试时,rspec-rails 试图更新数据库架构,但默认情况下,Rails 使用 schema.rb 文件来表示数据库架构,而不是 SQL 文件。因此,需要将配置更改为使用 SQL 格式的架构。

具体代码分析

rails_helper.rb

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
ActiveRecord::Migration.maintain_test_schema!

active_record/migration.rb 源码中

 def maintain_test_schema! #:nodoc:
   if ActiveRecord::Base.maintain_test_schema
     suppress_messages { load_schema_if_pending! }
   end
 end

继续追溯代码:

      def load_schema_if_pending!
        # 获取数据库配置信息
        current_db_config = Base.connection_db_config
        # 读取Rails.env 中的配置信息
        all_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env)
        # 检查是否需要更新数据库架构(重点注意)
        needs_update = !all_configs.all? do |db_config|
          Tasks::DatabaseTasks.schema_up_to_date?(db_config, ActiveRecord::Base.schema_format)
        end
        # 如果需要更新的话,清楚所有的连接,并且执行bin/rails db:test:prepare
        if needs_update
          # Roundtrip to Rake to allow plugins to hook into database initialization.
          root = defined?(ENGINE_ROOT) ? ENGINE_ROOT : Rails.root
          FileUtils.cd(root) do
            Base.clear_all_connections!
            system("bin/rails db:test:prepare")
          end
        end

        # Establish a new connection, the old database may be gone (db:test:prepare uses purge)
        Base.establish_connection(current_db_config)

        check_pending!
      end

ActiveRecord::Base.schema_format

这个设置有两个选项:

  • :sql当设置为 :sql 时,数据库架构将以数据库特定的 SQL 语句的形式导出。这意味着导出的文件将包含数据库特定的 SQL 命令,可以在相同类型的数据库中使用。

  • :ruby当设置为 :ruby 时,数据库架构将以 ActiveRecord::Schema 的格式导出。这是一个通用的格式,可以加载到支持迁移的任何数据库中。这允许您在不同的数据库适配器之间共享相同的数据库架构定义,例如在开发和测试环境中使用不同的数据库

  • 默认使用ruby。

  • :ruby 格式下导出数据库架构时,通常不会包括数据库中定义的函数(方法)。这是因为 :ruby 格式主要用于导出数据库表格的结构和约束,以及与 ActiveRecord 迁移相关的信息,而不包括数据库中的自定义函数、存储过程或触发器。

 文章来源地址https://www.toymoban.com/news/detail-732893.html

到了这里,关于ActiveRecord::Migration.maintain_test_schema!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux page migration源码分析

    目录 概述 __unmap_and_move函数 step1: Lock the page to be migrated step2:  Insure that writeback is complete. step3: Lock the new page that we want to move to.  step4:  All the page table references to the page are converted to migration entries. step5-step15: move_to_new_page step 5- step11 step 12- 15 step 16-18 概述 Linux 内核page migrat

    2024年02月11日
    浏览(39)
  • You have 18 unapplied migration(s). Your project may not work properly until you apply the migration

        成功解决错误 : You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.Run \\\'python manage.py migrate\\\' to apply them.     错误的现象是什么,为什么会发生这个错误,怎么解决呢。本文为你详细解释。 目录 一、错误现象

    2024年02月15日
    浏览(49)
  • MyBatis-plus中的两种快捷操作数据库方式:1、mapper调用 2、ActiveRecord方式(简称AR) 二者的使用和区别介绍

            在使用MyBatis操作数据库时,需要频繁的写mapper层dao接口以及对应的配置文件和SQL语句,当功能方法繁杂,业务逻辑不复杂的时候,我们可以使用MyBatis的升级版MyBatis-Plus来代替我们写这些繁琐的配置文件和简单的SQL。 (1)书写或使用MP生成数据库表对应的实体类。

    2024年02月07日
    浏览(67)
  • Django笔记二十之手动编写migration文件

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十之手动编写migration文件 前面介绍过,migration 文件主要记录的是 Django 系统 model 的变化,然后通过 migrate 命令将变化适配到数据库中。 比如在某个 application 下新增了某张表,或者对某张表更改了字段,可以生成 migration

    2023年04月09日
    浏览(46)
  • 论文笔记--Increasing Diversity While Maintaining Accuracy: Text Data Generation with Large Language Mode

    标题:Increasing Diversity While Maintaining Accuracy: Text Data Generation with Large Language Models and Human Interventions 作者:John Joon Young Chung, Ece Kamar, Saleema Amershi 日期:2023   文章给出了一种基于LLM自动生成训练数据的方法,且通过不同的实验设置尝试增加生成数据的多样性而又不降低数据

    2024年02月03日
    浏览(45)
  • 如何使用 .Net Core 实现数据库迁移 (Database Migration)

    当我们在编写基于数据库的应用程序时,随着需求的增加和改变,我们需要升级我们的数据库,变更数据库表的字段,当我们的系统的不同版本被部署到了不同的客户那里,在需要给客户升级时,我们如何实现数据库模式 (schema) 的自动升级呢? 传统的管理办法是针对每个数

    2024年02月05日
    浏览(55)
  • MySql Workbench 迁移工具 migration 提示缺少pyodbc 2.1.8 的解决方法

    想把公司的数据库转到MySQL,所以想装个MySQL测试,发现新版的MySQL(8.0.34)默认安装还是有不少问题, 一、譬如表、字段大小写的问题: lower_case_table_names=0 -- 表名存储为给定的大小和比较是区分大小写的 (linux 默认) lower_case_table_names=1 -- 表名存储在磁盘是小写的,但是比较

    2024年02月12日
    浏览(31)
  • Json Schema简介和Json Schema的.net实现库 LateApexEarlySpeed.Json.Schema

    Json schema是一种声明式语言,它可以用来标识Json的结构,数据类型和数据的具体限制,它提供了描述期望Json结构的标准化方法。 利用Json Schema, 你可以定义Json结构的各种规则,以便确定Json数据在各个子系统中交互传输时保持兼容和一致的格式。 一般来说,系统可以自己实现

    2024年02月04日
    浏览(40)
  • ruby web 实战(3)-Ruby基础(1)

    目录 关于 Ruby rbenv rbenv是类Unix系统上Ruby编程语言的版本管理工具 使用程序包管理器 安装ruby 安装gems 卸载Ruby版本 设置path 安装rails 集成字符串 注释与变量内插 字典HASH 数组 times迭代 想知道 Ruby 为什么会如此受欢迎吗?在粉丝眼中,Ruby 是一门优美而巧妙的语言,他们还认为

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包