【问题标题】:SQL INSERT INTO SELECT Statement in Rails 4 via connection.executeRails 4中的SQL INSERT INTO SELECT语句通过connection.execute
【发布时间】:2015-12-31 03:29:55
【问题描述】:
ActiveRecord::Base.connection.execute("INSERT INTO order_items (cart_id, quantity, product_id) SELECT cart_id, quantity, product_id FROM cart_items WHERE cart_id = ? ", cart_id)

我在控制器操作中运行上述代码以在表之间转移数据。

终端显示以下代码正在执行

nqjeV4HNx5So4Zx2x-81qg (9.3ms)  INSERT INTO order_items (cart_id, quantity, product_id) SELECT cart_id, quantity, product_id FROM cart_items WHERE cart_id = ? 

即使代码运行时没有引发任何错误,也不会将数据从 CartItem 模型移动到 OrderItem 模型。请让我知道我做错了什么。

我正在根据以下代码示例对我的查询进行建模:http://www.w3schools.com/sql/sql_insert_into_select.asp

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-4


    【解决方案1】:
    ActiveRecord::Base.connection.execute("INSERT INTO order_items (cart_id, quantity, product_id) SELECT cart_id, quantity, product_id FROM cart_items WHERE cart_id = ? ", cart_id)
    

    execute 方法不允许这种带有问号和红宝石变量的插值技术。该方法的第一个参数应该是一个完整的 SQL 查询。你应该这样做:

    "... WHERE cart_id = '#{cart_id}'"
    

    但这很危险,因为它允许 SQL 注入。在插入 cart_id 变量之前,您应该确保它只包含数字。

    其实这里你不需要使用纯SQL查询,因为你可以使用ActiveRecord来达到你的目的:

    ActiveRecord::Base.transaction do
      CartItem.where(cart_id: cart_id).each do |cart_item|
        OrderItem.create(cart_id: cart_item.cart_id, quantity: cart_item.quantity, product_id: cart_item.product_id)
      end
    end
    

    或者你可以使用https://github.com/zdennis/activerecord-importgem:

    cart_items = CartItem.where(cart_id: cart_id).pluck(:cart_id, :quantity, :product_id)
    OrderItem.import([:cart_id, :quantity, :product_id], cart_items)
    

    【讨论】:

    • 进行此更改后,我收到以下错误SQLException: no such column: ugMc7c9DL5q8LgQlzn5fCw: INSERT INTO order_items (cart_id, quantity, product_id) SELECT cart_id, quantity, product_id FROM cart_items WHERE cart_id = ugMc7c9DL5q8LgQlzn5fCw
    • #{cart_id}周围添加引号。
    • 我认为这可能是关于专栏的问题。检查您的表格和列
    • 感谢您的帮助。我还有一个问题。当我添加双引号 (") 时,它会在我的 IDE 中引发错误。当我添加单引号 '#{cart_id}' 时,我收到以下错误 SQLite3::ConstraintException: NOT NULL constraint failed: order_items.created_at: INSERT INTO order_items (cart_id, quantity, product_id) SELECT cart_id, quantity, product_id FROM cart_items WHERE cart_id = 'ugMc7c9DL5q8LgQlzn5fCw'
    • 您对order_items 列之一具有 NOT NULL 约束。这意味着该列不能是NULL,但是当您这样做INSERT 时,您没有为此列指定值。这可能是这三列之一或其他一些列。检查schema.rb 并查看order_items 中的哪一列有null: false
    猜你喜欢
    • 2021-01-19
    • 2019-01-24
    • 2012-10-18
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多