【问题标题】:Psych control characters are not allowed at line 1 column 1第 1 行第 1 列不允许使用心理控制字符
【发布时间】:2015-08-13 17:40:20
【问题描述】:

我正在使用yaml_db gem 将我的数据库从PHP/mySQL 迁移到RoR/Postgres。当我运行时,我在输入 YAML 文件的第 1555870 行(约 4M)上收到上述错误:

bundle exec rake db:data:load RAILS_ENV=production

它似乎取决于行或大小 - 我已将其缩小到这一特定行,目前对此有评论:

-
  slot_id: '2628865'
  sheet_id: '18485'
  label: '10:20am to 12:20pm'
  name: 'Jim Watson'
  email: ''
#bad here - moving "breakrighthere" before this comment throws error related to bad syntax
breakrighthere
-
  slot_id: '2628866'
  sheet_id: '18485'
  label: '2:35pm to 3:05pm'
  name: 'Christy Brown'
  email: ''

堆栈跟踪:

rake aborted!
Psych::SyntaxError: (<unknown>): control characters are not allowed at line 1 column 1
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/yaml_db-0.3.0/lib/yaml_db.rb:61:in `load_documents'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/yaml_db-0.3.0/lib/serialization_helper.rb:57:in `block in load'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/transaction.rb:188:in `within_new_transaction'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/yaml_db-0.3.0/lib/serialization_helper.rb:56:in `load'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/yaml_db-0.3.0/lib/serialization_helper.rb:31:in `load'
/home/signup/app/releases/11/vendor/bundle/ruby/2.1.0/gems/yaml_db-0.3.0/lib/tasks/yaml_db_tasks.rake:35:in `block (3 levels) in <top (required)>'
Tasks: TOP => db:data:load
(See full trace by running task with --trace)

有什么想法吗?

【问题讨论】:

  • 是否有一些不可见的控制字符滑入 YAML?你能cat -vet那块 YAML 看看有没有什么奇怪的东西出现吗?
  • 好建议@mu,但我看到的只是'$'行终止符。
  • 有什么理由不只是从 MySQL 中转储 CSV 并在 PostgreSQL 中进行 COPY 以加载数据?您必须手动重写架构,但这不应该那么困难。或者看看其他不使用 YAML 的工具,对于这样的任务,YAML 似乎是一个非常奇怪的选择。
  • 谢谢@mu。我切换到 CSV,稍加注意,在服务器上使用了一些 sed/perl 命令,它看起来很棒。感谢您的帮助 - 如果您输入此作为答案,我会接受。
  • 我觉得我没有回答任何问题,我只是指出了一些可能的替代方案。一个简单的“谢谢”是我应得的。现在,如果我已经通过那个 gem 来找出它为什么会产生无效的 YAML...

标签: ruby postgresql rake yaml ruby-on-rails-4.2


【解决方案1】:

我遇到了同样的错误,希望对以后可能会看到此问题的人有所帮助,结果是一个空格错误。

我在多个应用程序中打开了该文件,它改变了制表符的空格数量。

先检查间距!如果这最终成为问题,这是最容易解决的事情!

【讨论】:

    【解决方案2】:

    该错误具有误导性,但您给出的示例是不正确的 YAML,并且应该在任何解析器中引发错误。您可以在某些在线解析器(基于 python)中轻松检查在输入文本时,withwithout 评论。

    问题是在未缩进的行的开头应该有一个破折号(如果破折号不在行的开头,您可以选择缩进以完成块样式的序列)。

    【讨论】:

    • 我认为 breakrighthere 只是作为调试辅助添加的标记,我不认为该工具正在转储 YAML 的一部分。
    • @muistooshort 我考虑过这一点,但我认为在这种情况下,OP 也可以注释掉该行以获得相同的效果。或者只是在一行中指出整个事情:#in the line before this one here things go wrong
    • 感谢 Anthon 但@mu 是正确的。我想我应该解释一下,但我认为这很明显。我收到了这个无用的错误消息,然后使用“breakrighthere”通过“二进制搜索”找出它发生在哪里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2016-03-03
    • 2013-05-10
    • 2019-02-25
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多