【问题标题】:data into datetime column does not inserted correctly while csv importing into database将 csv 导入数据库时​​,未正确插入日期时间列中的数据
【发布时间】:2015-12-14 12:51:25
【问题描述】:

我正在创建一个 ruby​​ on rails 应用程序。将日期导入 available_on 列时,日期未正确插入数据库。当我使用 csv 文件导入数据时,它会发生变化。

def import
  require 'csv'
  file = params[:file]
  CSV.foreach(file.path, headers: true) do |row|
    @prod = Spree::Product.new()
    @prod.name = row["name"]
    @prod.shipping_category_id = row["shipping_category_id"]
    @prod.description = row["description"]
    @prod.available_on = row["available_on"]
    @prod.meta_description = row["meta_description"]
    @prod.meta_keywords = row["meta_keywords"]
    @prod.tax_category_id = row["tax_category_id"]
    @prod.shipping_category_id = row["shipping_category_id"]
    @prod.promotionable = row["promotionable"]
    @prod.meta_title = row["meta_title"]
    @prod.featured = row["featured"]
    @prod.supplier_id = row["supplier_id"]
    @prod.master.price = row["master_price"]
    @prod.master.cost_price = row["cost_price"]
    @prod.master.depth = row["depth"]
    @prod.master.height = row["height"]
    @prod.master.width = row["width"]
    @prod.master.weight = row["weight"]
    @prod.master.sku = row["sku"]
    @prod.master.tax_category_id = row["tax_category_id"]
    @prod.save!
  end 
end

我的数据库表是这样的:

| id                   | int(11)     
| name                 | varchar(255)
| description          | text        
| available_on         | datetime    
| deleted_at           | datetime    
| slug                 | varchar(255)
| meta_description     | text        
| meta_keywords        | varchar(255)
| tax_category_id      | int(11)     
| shipping_category_id | int(11)     
| created_at           | datetime    
| updated_at           | datetime    
| promotionable        | tinyint(1)  
| meta_title           | varchar(255)
| featured             | tinyint(1)  
| supplier_id          | int(11)    

我知道这是由于 available_on 的数据类型。 我在available_on中插入了日期,就像'2015-10-10'。 任何人都可以告诉如何在导入 csv 文件时从数据库中删除这种不一致

【问题讨论】:

    标签: ruby-on-rails ruby csv mysql2


    【解决方案1】:

    使用:converters 选项告诉Ruby 自动转换日期字段:

    require 'csv'
    
    def import
      file = params[:file]
    
      CSV.foreach(file.path, headers: true, converters: :date) do |row|
        # ...
      end 
    end
    

    附:我可以建议清理一下吗?

    PRODUCT_ATTR_NAMES = %w[ name             shipping_category_id  description
                             available_on     meta_description      meta_keywords
                             tax_category_id  promotionable         meta_title
                             featured         supplier_id ]
    
    MASTER_ATTR_NAMES = %w[ master_price  cost_price  depth  height
                            width         weight      sku    tax_category_id ]
    
    def import
      require 'csv'
      file = params[:file]
    
      CSV.foreach(file.path, headers: true, converters: :date) do |row|
        row = row.to_hash
        product_attrs = row.slice(*PRODUCT_ATTR_NAMES)
        master_attrs = row.slice(*MASTER_ATTR_NAMES)
    
        @prod = Spree::Product.create!(product_attrs) do |product|
          product.master.assign_attributes(master_attrs)
        end
      end 
    end
    

    【讨论】:

    • 当我的 csv 的 available_on 列中有 15-12-2015 时,它会像这样“2015-11-14 18:30:00”插入到数据库中。这是错误的,我希望它会像 2015 年 12 月 15 日那样插入,然后是时间。这可能吗?
    • 我不知道您所说的“当时”是什么意思,但这与您的区域设置有关。 2015-11-14 18:30:00 UTC 与 2015-11-15 00:00:00 UTC+0530 相同。如果 UTC+0530(印度和斯里兰卡)是您的时区,那么它似乎已正确插入。您需要配置您的应用程序以显示您首选时区的日期。
    • config.time_zone = 'Kolkata' config.active_record.default_timezone = :local 这已添加到我的配置/应用程序文件中,但它不起作用。
    【解决方案2】:

    您应该将值解析为 Time 类的实例:

    require 'time'
    
    @prod.available_on = Time.parse(row["available_on"])
    

    您很可能还想对其他列进行一些类型转换。那些应该包含整数值,例如:

    @prod.tax_category_id = Integer(row["tax_category_id"])
    

    对于其他非字符串值也是如此。

    【讨论】:

    • 当我这样做时,它会在“Spree::Admin::ProductsController#import”和“没有将日期隐式转换为字符串”中显示错误 TypeError。如何消除此错误。
    • 哪一行导致TypeError?
    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 2012-05-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多