1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

add a truncate method to the connection

it doesn't work on SQLite3 since it doesn't support truncate, but that's
OK.  If you call truncate on the connection, you're now bound to that
database (same as if you use hstore or any other db specific feature).
This commit is contained in:
Aaron Patterson 2014-09-22 14:57:07 -07:00
parent 53a8a7f9cb
commit 9a4e183fe9
6 changed files with 38 additions and 0 deletions

View file

@ -1,3 +1,5 @@
* Add a truncate method to the connection.
* Don't autosave unchanged has_one through records. * Don't autosave unchanged has_one through records.
*Alan Kennedy*, *Steve Parrington* *Alan Kennedy*, *Steve Parrington*

View file

@ -83,6 +83,11 @@ module ActiveRecord
exec_query(sql, name, binds) exec_query(sql, name, binds)
end end
# Executes the truncate statement.
def truncate(table_name, name = nil)
raise NotImplementedError
end
# Executes update +sql+ statement in the context of this connection using # Executes update +sql+ statement in the context of this connection using
# +binds+ as the bind substitutes. +name+ is logged along with # +binds+ as the bind substitutes. +name+ is logged along with
# the executed +sql+ statement. # the executed +sql+ statement.

View file

@ -389,6 +389,10 @@ module ActiveRecord
end end
end end
def truncate(table_name, name = nil)
execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
end
def table_exists?(name) def table_exists?(name)
return false unless name.present? return false unless name.present?
return true if tables(nil, nil, name).any? return true if tables(nil, nil, name).any?

View file

@ -255,6 +255,10 @@ module ActiveRecord
@statements.clear @statements.clear
end end
def truncate(table_name, name = nil)
exec_query "TRUNCATE TABLE #{quote_table_name(table_name)}", name, []
end
# Is this connection alive and ready for queries? # Is this connection alive and ready for queries?
def active? def active?
@connection.query 'SELECT 1' @connection.query 'SELECT 1'

View file

@ -4,6 +4,8 @@ require 'support/connection_helper'
class MysqlConnectionTest < ActiveRecord::TestCase class MysqlConnectionTest < ActiveRecord::TestCase
include ConnectionHelper include ConnectionHelper
fixtures :comments
def setup def setup
super super
@subscriber = SQLSubscriber.new @subscriber = SQLSubscriber.new
@ -24,6 +26,17 @@ class MysqlConnectionTest < ActiveRecord::TestCase
end end
end end
def test_truncate
rows = ActiveRecord::Base.connection.exec_query("select count(*) from comments")
count = rows.first.values.first
assert_operator count, :>, 0
ActiveRecord::Base.connection.truncate("comments")
rows = ActiveRecord::Base.connection.exec_query("select count(*) from comments")
count = rows.first.values.first
assert_equal 0, count
end
def test_no_automatic_reconnection_after_timeout def test_no_automatic_reconnection_after_timeout
assert @connection.active? assert @connection.active?
@connection.update('set @@wait_timeout=1') @connection.update('set @@wait_timeout=1')

View file

@ -8,6 +8,8 @@ module ActiveRecord
class NonExistentTable < ActiveRecord::Base class NonExistentTable < ActiveRecord::Base
end end
fixtures :comments
def setup def setup
super super
@subscriber = SQLSubscriber.new @subscriber = SQLSubscriber.new
@ -20,6 +22,14 @@ module ActiveRecord
super super
end end
def test_truncate
count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
assert_operator count, :>, 0
ActiveRecord::Base.connection.truncate("comments")
count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
assert_equal 0, count
end
def test_encoding def test_encoding
assert_not_nil @connection.encoding assert_not_nil @connection.encoding
end end