【问题标题】:Rails on Oracle database with table name over 30 characters long and Globalize can't find my table表名超过 30 个字符且 Globalize 找不到我的表的 Oracle 数据库上的 Rails
【发布时间】:2019-03-12 23:22:41
【问题描述】:

我正在移植一个 MySQL 数据库,我想迁移到一个 Oracle DB 12cRC2。问题是我的某些表的名称长度超过 30 个字符。

一切正常(在我的 schema.rb 文件有点混乱之后)。

我正在使用“全球化”gem 来本地化我的数据库。

当我运行种子时,我的翻译表出现错误,例如:

OCIError: ORA-04043: object "aaaaaaaa_bbbbb_cccc_translations" does not exist

但是当我使用 sqlplus 时,我可以看到我的表没有问题......无论是使用 DESC 还是 SELECT 查询。

我使用oracle-instantclient12.2连接。

我怀疑表名长度,因为其他名称较小的表不会引发执行

我的堆栈:

rails aborted!
ActiveRecord::ConnectionAdapters::OracleEnhanced::ConnectionException: "DESC aaaaaaaa_bbbbb_cccc_translations" failed; does it exist?
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb:209:in `rescue in describe'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb:202:in `describe'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:552:in `pk_and_sequence_for'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:585:in `primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/connection_adapters/schema_cache.rb:43:in `primary_keys'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/attribute_methods/primary_key.rb:100:in `get_primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/attribute_methods/primary_key.rb:87:in `reset_primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/attribute_methods/primary_key.rb:75:in `primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/foreign_association.rb:6:in `foreign_key_present?'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/association.rb:203:in `find_target?'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/collection_association.rb:272:in `load_target'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/collection_proxy.rb:46:in `load_target'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/collection_proxy.rb:1032:in `records'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation/delegation.rb:71:in `each'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:130:in `detect'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:130:in `translation_for'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:124:in `translation'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:162:in `save'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/persistence.rb:36:in `create'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:85:in `block in create'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:281:in `scoping'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:85:in `create'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:164:in `find_or_create_by'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/querying.rb:8:in `find_or_create_by'
/beecom/lib/tasks/aaaaaaaa_bbbbb_cccc.rake:10:in `block (3 levels) in <top (required)>'
/beecom/lib/tasks/aaaaaaaa_bbbbb_cccc.rake:9:in `each'
/beecom/lib/tasks/aaaaaaaa_bbbbb_cccc.rake:9:in `block (2 levels) in <top (required)>'
/beecom/db/seeds.rb:209:in `<top (required)>'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:285:in `load'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:285:in `block in load'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:257:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:285:in `load'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/engine.rb:551:in `load_seed'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/tasks/database_tasks.rb:281:in `load_seed'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/railties/databases.rake:194:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/commands.rb:18:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'

Caused by:
OCIError: ORA-04043: object "aaaaaaaa_bbbbb_cccc_translations" does not exist
metadata.c:175:in oci8lib_260.so
/usr/local/bundle/gems/ruby-oci8-2.2.7/lib/oci8/metadata.rb:2061:in `block in describe_table'
/usr/local/bundle/gems/ruby-oci8-2.2.7/lib/oci8/metadata.rb:2060:in `times'
/usr/local/bundle/gems/ruby-oci8-2.2.7/lib/oci8/metadata.rb:2060:in `describe_table'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb:350:in `describe'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb:206:in `describe'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:552:in `pk_and_sequence_for'
/usr/local/bundle/gems/activerecord-oracle_enhanced-adapter-5.2.5/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:585:in `primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/connection_adapters/schema_cache.rb:43:in `primary_keys'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/attribute_methods/primary_key.rb:100:in `get_primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/attribute_methods/primary_key.rb:87:in `reset_primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/attribute_methods/primary_key.rb:75:in `primary_key'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/foreign_association.rb:6:in `foreign_key_present?'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/association.rb:203:in `find_target?'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/collection_association.rb:272:in `load_target'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/collection_proxy.rb:46:in `load_target'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/associations/collection_proxy.rb:1032:in `records'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation/delegation.rb:71:in `each'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:130:in `detect'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:130:in `translation_for'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:124:in `translation'
/usr/local/bundle/gems/globalize-5.2.0/lib/globalize/active_record/instance_methods.rb:162:in `save'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/persistence.rb:36:in `create'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:85:in `block in create'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:281:in `scoping'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:85:in `create'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/relation.rb:164:in `find_or_create_by'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/querying.rb:8:in `find_or_create_by'
/beecom/lib/tasks/aaaaaaaa_bbbbb_cccc.rake:10:in `block (3 levels) in <top (required)>'
/beecom/lib/tasks/aaaaaaaa_bbbbb_cccc.rake:9:in `each'
/beecom/lib/tasks/aaaaaaaa_bbbbb_cccc.rake:9:in `block (2 levels) in <top (required)>'
/beecom/db/seeds.rb:209:in `<top (required)>'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:285:in `load'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:285:in `block in load'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:257:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:285:in `load'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/engine.rb:551:in `load_seed'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/tasks/database_tasks.rb:281:in `load_seed'
/usr/local/bundle/gems/activerecord-5.2.2/lib/active_record/railties/databases.rake:194:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-5.2.2/lib/rails/commands.rb:18:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:seed

【问题讨论】:

    标签: mysql ruby-on-rails oracle globalize


    【解决方案1】:

    您的表名“aaaaaaaa_bbbbb_cccc_translations”的长度为 32 字节,限制为 30,但在 12cR2 中已增加到 128。但我猜您用于访问数据库的客户端工具在处理较长名称时存在问题。

    https://oracle-base.com/articles/12c/long-identifiers-12cr2

    【讨论】:

    • 我正在使用 oracle-instantclient12.2
    • 如果名称较短的表可以工作,这听起来像是长度限制。 oracle 中的另一个特殊问题是,如果未引用表名,则表名被认为是大写的。所以如果你创建一个像 CREATE TABLE "aaa" 这样的表,那么你不能通过 select * from aaa 来查询它,你需要 select from "aaa"。但这对于长命名表和短命名表是一样的 :)
    • 是的,但我做了几个测试,这不是问题。
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多