sequel 3.32.0 → 3.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +42 -0
- data/Rakefile +3 -2
- data/doc/migration.rdoc +41 -14
- data/doc/opening_databases.rdoc +2 -0
- data/doc/release_notes/3.29.0.txt +1 -1
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/sharding.rdoc +93 -7
- data/doc/testing.rdoc +1 -1
- data/lib/sequel/adapters/do.rb +1 -0
- data/lib/sequel/adapters/do/mysql.rb +6 -0
- data/lib/sequel/adapters/jdbc.rb +1 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -5
- data/lib/sequel/adapters/mock.rb +10 -5
- data/lib/sequel/adapters/mysql.rb +23 -1
- data/lib/sequel/adapters/mysql2.rb +16 -2
- data/lib/sequel/adapters/postgres.rb +22 -4
- data/lib/sequel/adapters/shared/mysql.rb +51 -10
- data/lib/sequel/adapters/shared/postgres.rb +101 -63
- data/lib/sequel/adapters/shared/sqlite.rb +19 -0
- data/lib/sequel/adapters/sqlite.rb +71 -16
- data/lib/sequel/adapters/swift.rb +1 -0
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/connection_pool/sharded_single.rb +6 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +6 -1
- data/lib/sequel/connection_pool/threaded.rb +12 -11
- data/lib/sequel/database/connecting.rb +2 -0
- data/lib/sequel/database/misc.rb +6 -0
- data/lib/sequel/database/query.rb +1 -1
- data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
- data/lib/sequel/extensions/migration.rb +45 -7
- data/lib/sequel/extensions/server_block.rb +139 -0
- data/lib/sequel/model/associations.rb +9 -9
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +1 -1
- data/lib/sequel/plugins/list.rb +12 -2
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mysql_spec.rb +64 -8
- data/spec/adapters/postgres_spec.rb +139 -78
- data/spec/adapters/sqlite_spec.rb +87 -0
- data/spec/core/connection_pool_spec.rb +14 -0
- data/spec/core/database_spec.rb +5 -0
- data/spec/core/mock_adapter_spec.rb +21 -9
- data/spec/extensions/arbitrary_servers_spec.rb +114 -0
- data/spec/extensions/instance_hooks_spec.rb +19 -0
- data/spec/extensions/list_spec.rb +31 -0
- data/spec/extensions/migration_spec.rb +61 -4
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/files/transaction_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_migrations/002_create_basic.rb +3 -0
- data/spec/files/transactionless_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transactionless_migrations/002_create_basic.rb +4 -0
- data/spec/integration/dataset_test.rb +2 -2
- data/spec/integration/plugin_test.rb +9 -9
- data/spec/integration/schema_test.rb +3 -1
- data/spec/integration/transaction_test.rb +2 -2
- metadata +12 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,45 @@
|
|
1
|
+
=== 3.33.0 (2012-03-01)
|
2
|
+
|
3
|
+
* Add ability to force or disable transactions completely in the migrators using the :use_transactions option (jeremyevans)
|
4
|
+
|
5
|
+
* Add ability to turn off transactions for migrations by calling no_transaction inside the Sequel.migration block (jeremyevans)
|
6
|
+
|
7
|
+
* Allow specifically choosing which migrator to use via TimestampMigrator.apply or IntegerMigrator.apply (jeremyevans)
|
8
|
+
|
9
|
+
* Add arbitrary_servers extension to allow the use of arbitrary servers/shards by providing a hash of options as the server (jeremyevans)
|
10
|
+
|
11
|
+
* Add server_block extension to scope database access inside the block to a specific default server/shard (jeremyevans)
|
12
|
+
|
13
|
+
* Respect :collate column option on MySQL (jeremyevans) (#445)
|
14
|
+
|
15
|
+
* Use Mysql2::Client::FOUND_ROWS to get accurate number of rows matched in the mysql2 adapter (jeremyevans)
|
16
|
+
|
17
|
+
* Use Mysql#info to get accurate number of rows matched in the mysql adapter (jeremyevans)
|
18
|
+
|
19
|
+
* Make mock adapter with specific SQL dialect use appropriate defaults for quoting identifiers (jeremyevans)
|
20
|
+
|
21
|
+
* Make list plugin automatically set position field value on creation if not already set (jeremyevans)
|
22
|
+
|
23
|
+
* Add Database#integer_booleans setting on SQLite to store booleans as integers (jeremyevans)
|
24
|
+
|
25
|
+
* Typecast columns stored as integers/floats in the SQLite adapter (jeremyevans)
|
26
|
+
|
27
|
+
* In the instance_hooks plugin, (before|after)_*_hook instance methods now return self (jeremyevans)
|
28
|
+
|
29
|
+
* Handle NaN, Infinity, and -Infinity floats on PostgreSQL (kf8a, jeremyevans) (#444)
|
30
|
+
|
31
|
+
* Support an :sslmode option when using the postgres adapter with the pg driver (jeremyevans)
|
32
|
+
|
33
|
+
* Add Database#create_schema and #drop_schema to the shared postgres adapter (tkellen, jeremyevans) (#440)
|
34
|
+
|
35
|
+
* Add Database#supports_savepoints_in_prepared_transactions?, false on MySQL >=5.5.12 (jeremyevans) (#437)
|
36
|
+
|
37
|
+
* Support an identifier output method in the mysql2 adapter (jeremyevans)
|
38
|
+
|
39
|
+
* Make foreign key creation work on MySQL with InnoDB engine without specifying :key option (jeremyevans)
|
40
|
+
|
41
|
+
* Allow disabling use of sudo with SUDO='' when running the rake install/uninstall tasks (jeremyevans) (#433)
|
42
|
+
|
1
43
|
=== 3.32.0 (2012-02-01)
|
2
44
|
|
3
45
|
* Make serialization_modification_detection plugin work correctly with new objects and after saving existing objects (jeremyevans) (#432)
|
data/Rakefile
CHANGED
@@ -7,6 +7,7 @@ VERS = lambda do
|
|
7
7
|
Sequel.version
|
8
8
|
end
|
9
9
|
CLEAN.include ["**/.*.sw?", "sequel-*.gem", ".config", "rdoc", "coverage", "www/public/*.html", "www/public/rdoc*", '**/*.rbc']
|
10
|
+
SUDO = ENV['SUDO'] || 'sudo'
|
10
11
|
|
11
12
|
# Gem Packaging and Release
|
12
13
|
|
@@ -18,12 +19,12 @@ end
|
|
18
19
|
|
19
20
|
desc "Install sequel gem"
|
20
21
|
task :install=>[:package] do
|
21
|
-
sh %{
|
22
|
+
sh %{#{SUDO} gem install ./#{NAME}-#{VERS.call} --local}
|
22
23
|
end
|
23
24
|
|
24
25
|
desc "Uninstall sequel gem"
|
25
26
|
task :uninstall=>[:clean] do
|
26
|
-
sh %{
|
27
|
+
sh %{#{SUDO} gem uninstall #{NAME}}
|
27
28
|
end
|
28
29
|
|
29
30
|
desc "Upload sequel gem to gemcutter"
|
data/doc/migration.rdoc
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
This guide is based on http://guides.rubyonrails.org/migrations.html
|
4
4
|
|
5
|
-
|
6
5
|
== Overview
|
7
6
|
|
8
7
|
Migrations make it easy to alter your database's schema in a systematic manner.
|
@@ -14,20 +13,20 @@ create the necessary database structure manually using Sequel's schema
|
|
14
13
|
modification methods or another database tool. However, if you are dealing
|
15
14
|
with other developers, you'll have to send them all of the changes you are
|
16
15
|
making. Even if you aren't dealing with other developers, you generally have
|
17
|
-
to make the schema changes in 3 places (development, testing, and
|
16
|
+
to make the schema changes in 3 places (development, testing, and
|
18
17
|
production), and it's probably easier to use the migrations system to apply
|
19
18
|
the schema changes than it is to keep track of the changes manually and
|
20
19
|
execute them manually at the appropriate time.
|
21
20
|
|
22
21
|
Sequel tracks which migrations you have already run, so to apply migrations
|
23
|
-
you generally need to
|
22
|
+
you generally need to run Sequel's migrator with <tt>bin/sequel -m</tt>:
|
24
23
|
|
25
24
|
sequel -m path/to/migrations postgres://host/database
|
26
25
|
|
27
26
|
Migrations in Sequel use a very simple DSL via the <tt>Sequel.migration</tt>
|
28
27
|
method, and inside the DSL, use the <tt>Sequel::Database</tt> schema
|
29
28
|
modification methods such as +create_table+ and +alter_table+.
|
30
|
-
See the {schema modification guide}[link:files/doc/schema_modification_rdoc.html]
|
29
|
+
See the {schema modification guide}[link:files/doc/schema_modification_rdoc.html]
|
31
30
|
for details on the schema modification methods you can use.
|
32
31
|
|
33
32
|
== A Basic Migration
|
@@ -182,6 +181,31 @@ need to update the database by hand.
|
|
182
181
|
It's recommended to always run migrations on a test database and ensure they work
|
183
182
|
before running them on any production database.
|
184
183
|
|
184
|
+
== Transactions
|
185
|
+
|
186
|
+
As mentioned above, Sequel attempts to run migrations inside of a transaction by default.
|
187
|
+
However, you can disable this on a per migration basis by calling +no_transaction+ inside
|
188
|
+
of the Sequel.migration block:
|
189
|
+
|
190
|
+
Sequel.migration do
|
191
|
+
no_transaction
|
192
|
+
change do
|
193
|
+
# ...
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
This is necessary in some cases, such as when attempting to use CREATE INDEX CONCURRENTLY
|
198
|
+
on PostgreSQL.
|
199
|
+
|
200
|
+
You can also override the transactions setting at the migrator level, either by forcing
|
201
|
+
transactions even if no_transaction is set, or by disabling transactions all together:
|
202
|
+
|
203
|
+
# Force transaction use
|
204
|
+
Sequel::Migrator.run(DB, '/path/to/migrations/dir', :use_transactions=>true)
|
205
|
+
|
206
|
+
# Disable use of transactions
|
207
|
+
Sequel::Migrator.run(DB, '/path/to/migrations/dir', :use_transactions=>false)
|
208
|
+
|
185
209
|
== Migration files
|
186
210
|
|
187
211
|
While you can create migration objects yourself and apply them manually, most of the
|
@@ -267,7 +291,7 @@ is important though, as it is used to mean that all migrations should be unappli
|
|
267
291
|
=== +TimestampMigrator+ Filenames
|
268
292
|
|
269
293
|
With the +TimestampMigrator+, the version integer should represent a timestamp, though this isn't strictly
|
270
|
-
required.
|
294
|
+
required.
|
271
295
|
|
272
296
|
For example, for <tt>5/10/2010 12:00:00pm</tt>, you could use any of the following formats:
|
273
297
|
|
@@ -287,6 +311,9 @@ be difficult to unapply some the affected migrations correctly.
|
|
287
311
|
The +TimestampMigrator+ will be used if any filename in the migrations directory has a version
|
288
312
|
greater than 20000101. Otherwise, the +IntegerMigrator+ will be used.
|
289
313
|
|
314
|
+
You can force the use of the +TimestampMigrator+ in the API by calling TimestampMigrator.apply
|
315
|
+
instead of Migrator.apply.
|
316
|
+
|
290
317
|
=== How to choose
|
291
318
|
|
292
319
|
Basically, unless you need the features provided by the +TimestampMigrator+, stick with the
|
@@ -322,8 +349,8 @@ you should give it some thought before using it.
|
|
322
349
|
|
323
350
|
Just don't do it.
|
324
351
|
|
325
|
-
In general, you should not modify any migration that has been run on the database and been committed
|
326
|
-
the source control repository, unless the migration contains
|
352
|
+
In general, you should not modify any migration that has been run on the database and been committed to
|
353
|
+
the source control repository, unless the migration contains an error that causes data loss. As long
|
327
354
|
as it is possible to undo the migration without losing data, you should just add another migration
|
328
355
|
that undoes the actions of the previous bad migration, and maybe does the correct action afterward.
|
329
356
|
|
@@ -358,7 +385,7 @@ or they should use the reversible migrations feature with a +change+ block:
|
|
358
385
|
It's usually easy to determine what you should put in your migration's +up+ block,
|
359
386
|
as it's whatever change you want to make to the database. The +down+ block is
|
360
387
|
less obvious. In general, it should reverse the changes made by the +up+ block, which means
|
361
|
-
it should execute the opposite of what the +up+ block does in the reverse order in which
|
388
|
+
it should execute the opposite of what the +up+ block does in the reverse order in which
|
362
389
|
the +up+ block does it. Here's an example where you are switching from having a single
|
363
390
|
artist per album to multiple artists per album:
|
364
391
|
|
@@ -402,12 +429,12 @@ artist per album to multiple artists per album:
|
|
402
429
|
end
|
403
430
|
end
|
404
431
|
|
405
|
-
Note that the
|
406
|
-
reverse order
|
407
|
-
isn't always possible to reverse exactly what was done in the +up+ block.
|
408
|
-
|
409
|
-
|
410
|
-
|
432
|
+
Note that the operations performed in the +down+ block are performed in the
|
433
|
+
reverse order of how they are performed in the +up+ block. Also note how it
|
434
|
+
isn't always possible to reverse exactly what was done in the +up+ block. You
|
435
|
+
should try to do so as much as possible, but if you can't, you may want to have
|
436
|
+
your +down+ block raise a <tt>Sequel::Error</tt> exception saying why the
|
437
|
+
migration cannot be reverted.
|
411
438
|
|
412
439
|
== Running migrations
|
413
440
|
|
data/doc/opening_databases.rdoc
CHANGED
@@ -345,6 +345,8 @@ The following additional options are supported:
|
|
345
345
|
:encoding :: Set the client_encoding to the given string
|
346
346
|
:connect_timeout :: Set the number of seconds to wait for a connection (default 20, only respected
|
347
347
|
if using the pg library).
|
348
|
+
:sslmode :: Set to 'disable', 'allow', 'prefer', 'require' to choose how to treat SSL (only
|
349
|
+
respected if using the pg library)
|
348
350
|
|
349
351
|
=== sqlite
|
350
352
|
|
@@ -130,7 +130,7 @@
|
|
130
130
|
* Database#<< and Dataset#<< now return self, which allow them
|
131
131
|
to be used in chaining:
|
132
132
|
|
133
|
-
DB << "
|
133
|
+
DB << "UPDATE foo SET bar_id = NULL" << "DROP TABLE bars"
|
134
134
|
DB[:foo] << {:bar_id=>0} << DB[:bars].select(:id)
|
135
135
|
|
136
136
|
* A Database#timezone accessor has been added, allowing you to
|
@@ -0,0 +1,157 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A server_block extension has been added that makes Sequel's
|
4
|
+
sharding support easier to use by scoping database access inside
|
5
|
+
the block to a given server/shard:
|
6
|
+
|
7
|
+
Sequel.extension :server_block
|
8
|
+
DB.extend Sequel::ServerBlock
|
9
|
+
DB.with_server(:shard_1) do
|
10
|
+
# All of these will execute against shard_1
|
11
|
+
DB.tables
|
12
|
+
DB[:table].all
|
13
|
+
DB.run 'SOME SQL'
|
14
|
+
end
|
15
|
+
|
16
|
+
* An arbitrary_servers extension has been added that extends
|
17
|
+
Sequel's sharding support so that you can use arbitrary
|
18
|
+
connection options instead of referencing an existing, predefined
|
19
|
+
server/shard:
|
20
|
+
|
21
|
+
Sequel.extension :arbitrary_servers
|
22
|
+
DB.pool.extend Sequel::ArbitraryServers
|
23
|
+
DB[:table].server(:host=>'foo', :database=>'bar').all
|
24
|
+
|
25
|
+
You can use this extension in conjunction with the server_block
|
26
|
+
extension:
|
27
|
+
|
28
|
+
DB.with_server(:host=>'foo', :database=>'bar') do
|
29
|
+
DB.synchronize do
|
30
|
+
# All of these will execute on host foo, database bar
|
31
|
+
DB.tables
|
32
|
+
DB[:table].all
|
33
|
+
DB.run 'SOME SQL'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
The combination of these two extensions makes it pretty easy to
|
38
|
+
write a thread-safe Rack middleware that scopes each request
|
39
|
+
to an arbitrary database.
|
40
|
+
|
41
|
+
* The sqlite adapter now supports an integer_booleans setting
|
42
|
+
for using 1/0 for true/false values, instead of the the 't'/'f'
|
43
|
+
values used by default. As SQLite recommends using integers to
|
44
|
+
store booleans, converting your existing database and enabling
|
45
|
+
this setting is recommended, but for backwards compatibility it
|
46
|
+
is set to false. You can convert you existing database by doing
|
47
|
+
the following for each table/column that has booleans:
|
48
|
+
|
49
|
+
DB[:table].update(:boolean_column=>{'t'=>1}.
|
50
|
+
case(0, :boolean_column))
|
51
|
+
|
52
|
+
The integer_booleans default setting may change in a future
|
53
|
+
version of Sequel, so you should set it manually to false if you
|
54
|
+
prefer the current default.
|
55
|
+
|
56
|
+
* You can now disable transaction use in migrations, in one of two
|
57
|
+
ways. You generally only need to do this if you are using an
|
58
|
+
SQL query inside a migration that is specifically not supported
|
59
|
+
inside a transaction, such as CREATE INDEX CONCURRENTLY on
|
60
|
+
PostgreSQL.
|
61
|
+
|
62
|
+
The first way to disable transactions is on a per-migration basis
|
63
|
+
by calling the no_transaction method inside the Sequel.migration
|
64
|
+
block:
|
65
|
+
|
66
|
+
Sequel.migration do
|
67
|
+
no_transaction
|
68
|
+
change do
|
69
|
+
# ...
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
That will make it so that a transaction is not used for that
|
74
|
+
particular migration. The second way is passing the
|
75
|
+
:use_tranctions=>false option when calling Migrator.run (using
|
76
|
+
the API), which will completely disable transactions for all
|
77
|
+
migrations during the migrator run.
|
78
|
+
|
79
|
+
* The postgres adapter now respects an :sslmode option when using
|
80
|
+
pg as the underlying driver, you can set the value of this option to
|
81
|
+
disable, allow, prefer, or require.
|
82
|
+
|
83
|
+
* Database#create_schema and #drop_schema are now defined when
|
84
|
+
connecting to PostgreSQL.
|
85
|
+
|
86
|
+
* Database#supports_savepoints_in_prepared_transactions? has been
|
87
|
+
added for checking if savepoints are supported inside prepared
|
88
|
+
transactions. This is true if both savepoints and prepared
|
89
|
+
transactions are both supported, except on MySQL > 5.5.12 (due to
|
90
|
+
MySQL bug 64374).
|
91
|
+
|
92
|
+
= Other Improvements
|
93
|
+
|
94
|
+
* The mysql and mysql2 adapters now both provide an accurate number
|
95
|
+
of rows matched, so Sequel::Model usage on those adapters will now
|
96
|
+
raise a NoExistingObject exception by default if you attempt to
|
97
|
+
delete or update an instance that no longer exists in the database.
|
98
|
+
|
99
|
+
* Foreign key creation now works correctly without specifying the
|
100
|
+
:key option when using MySQL with the InnoDB table engine. InnoDB
|
101
|
+
requires that you list the column explicitly, even if you are
|
102
|
+
referencing the primary key of the table, so if the :key option is
|
103
|
+
not given, the database schema is introspected to find the primary
|
104
|
+
key for the table. If you are attempting to create a table with
|
105
|
+
a self-referential foreign key, it introspects the generator to
|
106
|
+
get the primary key for the table.
|
107
|
+
|
108
|
+
* The sqlite adapter will now return 1/0 stored in boolean columns as
|
109
|
+
true/false. It will convert dates stored as Integers/Floats to
|
110
|
+
Date objects by assuming they represent the julian date. It will
|
111
|
+
convert times stored as Integers/Floats to Sequel::SQLTime objects
|
112
|
+
by assuming they represent a number of seconds. It will convert
|
113
|
+
datetimes stored as Integers by assuming they represent a unix
|
114
|
+
epoch time integer, and datetimes stored as Floats by assuming the
|
115
|
+
represent the julian date (with fractional part representing the
|
116
|
+
time of day). These changes make Sequel handle SQLite's
|
117
|
+
recommendations for boolean/date/time storage.
|
118
|
+
|
119
|
+
* The instance_hooks plugin's (before|after)_*_hook methods now return
|
120
|
+
self so they can be used in a method chain.
|
121
|
+
|
122
|
+
* The list plugin now automatically adds new entries to the end of the
|
123
|
+
list when creating the entries, if the position field is not
|
124
|
+
specifically set.
|
125
|
+
|
126
|
+
* An identifier_output_method is now respected in the mysql2 adapter.
|
127
|
+
|
128
|
+
* NaN/Infinity Float values are now quoted correctly for input on
|
129
|
+
PostgreSQL, and the postgres adapter correctly handles them on
|
130
|
+
retrieval from the database.
|
131
|
+
|
132
|
+
* The :collate column option is now respected when creating tables or
|
133
|
+
altering columns on MySQL.
|
134
|
+
|
135
|
+
* You can now force use of the TimestampMigrator when the
|
136
|
+
IntegerMigrator would be used by default by calling
|
137
|
+
TimestampMigrator.apply or .run.
|
138
|
+
|
139
|
+
* Mock adapter usage with a specific SQL dialect now uses the
|
140
|
+
appropriate defaults for quoting identifiers.
|
141
|
+
|
142
|
+
* You can now disable the use of sudo in the rake install/uninstall
|
143
|
+
tasks using the SUDO='' environment variable.
|
144
|
+
|
145
|
+
* A very misleading error message has been fixed when attempting
|
146
|
+
to constantize an invalid string in the model inflector.
|
147
|
+
|
148
|
+
= Backwards Compatibility
|
149
|
+
|
150
|
+
* The sqlite adapter now typecasts columns that SQLite stores as
|
151
|
+
INTEGER/REAL. Previously, it only typecasted columns that
|
152
|
+
SQLite stored as TEXT/BLOB. For details about SQLite storage, see
|
153
|
+
http://www.sqlite.org/datatype3.html.
|
154
|
+
|
155
|
+
Any custom type conversion procs used with the sqlite adapter should
|
156
|
+
be modified to work with Integer/Float objects in addition to String
|
157
|
+
objects.
|
data/doc/sharding.rdoc
CHANGED
@@ -8,13 +8,23 @@ that ship with Sequel.
|
|
8
8
|
|
9
9
|
== The :servers Database option
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
Sharding and read_only support are both enabled via the :servers database
|
12
|
+
option. Using the :servers database option makes Sequel use a connection pool
|
13
|
+
class that supports sharding, and the minimum required to enable sharding
|
14
|
+
support is to use the empty hash:
|
15
|
+
|
16
|
+
DB=Sequel.connect('postgres://master_server/database', :servers=>{})
|
17
|
+
|
18
|
+
In most cases, you are probably not going to want to use an empty hash,
|
19
|
+
so you'll want to have entries in the hash. Keys in the server hash are
|
20
|
+
not restricted to type, but the general recommendation is to use a symbol
|
21
|
+
unless you have special requirements. Values in the server hash should be
|
22
|
+
either hashes or procs that return hashes. These hashes are merged into
|
23
|
+
the Database object's default options hash to get the connection options
|
24
|
+
for the shard, so you don't need to override all options, just the ones
|
25
|
+
that need to be modified. For example, if you are using the same user,
|
26
|
+
password, and database name and just the host is changing, you only need
|
27
|
+
a :host entry in each shard's hash.
|
18
28
|
|
19
29
|
Note that all servers should have the same schema for all
|
20
30
|
tables you are accessing, unless you really know what you are doing.
|
@@ -159,3 +169,79 @@ work well with shards. You just need to remember to set to model to use the plu
|
|
159
169
|
If all of your models are sharded, you can set all models to use the plugin via:
|
160
170
|
|
161
171
|
Sequel::Model.plugin :sharding
|
172
|
+
|
173
|
+
=== server_block Extension
|
174
|
+
|
175
|
+
By default, you must specify the server/shard you want to use for every dataset/action,
|
176
|
+
or Sequel will use the default shard. If you have a group of queries that should use the
|
177
|
+
same shard, it can get a bit redundent to specify the same shard for all of them.
|
178
|
+
|
179
|
+
The server_block extension adds a Database#with_server method that scopes all database
|
180
|
+
access inside the block to the given shard by default:
|
181
|
+
|
182
|
+
Sequel.extension :server_block
|
183
|
+
DB.extend Sequel::ServerBlock
|
184
|
+
DB.with_server(:a) do
|
185
|
+
# this SELECT query uses the "a" shard
|
186
|
+
if r = Rainbow.first(:hash=>/31337/)
|
187
|
+
r.count += 1
|
188
|
+
# this UPDATE query also uses the "a" shard
|
189
|
+
r.save
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
The server_block extension doesn't currently integrate with the sharding plugin, as it
|
194
|
+
ties into the Dataset#server method. This shouldn't present a problem in practice as
|
195
|
+
long as you just access the models inside the with_server block, since they will use
|
196
|
+
the shard set by with_server by default. However, you will probably have issues if
|
197
|
+
you retrieve the models inside the block and save them outside of the block. If you
|
198
|
+
need to do that, call the server method explicitly on the dataset used to retrieve the
|
199
|
+
model objects.
|
200
|
+
|
201
|
+
=== arbitrary_servers Extension
|
202
|
+
|
203
|
+
By default, Sequel's sharding support is designed to work with predefined shards. It ships
|
204
|
+
with Database#add_servers and Database#remove_servers methods to modify these predefined
|
205
|
+
shards on the fly, but it is a bit cumbersome to work with truly arbitrary servers
|
206
|
+
(requiring you to call add_servers before use, then remove_servers after use).
|
207
|
+
|
208
|
+
The arbitrary_servers extension allows you to pass a server/shard options hash as the
|
209
|
+
server to use, and those options will be merged directly into the database's default options:
|
210
|
+
|
211
|
+
Sequel.extension :arbitrary_servers
|
212
|
+
DB.pool.extend Sequel::ArbitraryServers
|
213
|
+
DB[:rainbows].server(:host=>'hash_host_a').all
|
214
|
+
# or
|
215
|
+
DB[:rainbows].server(:host=>'hash_host_b', :database=>'backup').all
|
216
|
+
|
217
|
+
arbitrary_servers is designed to work well in conjunction with the server_block extension:
|
218
|
+
|
219
|
+
DB.with_server(:host=>'hash_host_b', :database=>'backup') do
|
220
|
+
DB.synchronize do
|
221
|
+
# All queries here default to the backup database on hash_host_b
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
If you are using arbitrary_servers with server_block, you may want to
|
226
|
+
define the following method (or something similar) so that you don't
|
227
|
+
need to call synchronize separately:
|
228
|
+
|
229
|
+
def DB.with_server(*)
|
230
|
+
super{synchronize{yield}}
|
231
|
+
end
|
232
|
+
|
233
|
+
The reason for the synchronize method is that it checks out a connection
|
234
|
+
and makes the same connection available for the duration of the block.
|
235
|
+
If you don't do that, Sequel will probably disconnect from the database
|
236
|
+
and reconnect to the database on each request, since connections to
|
237
|
+
arbitrary servers are not cached.
|
238
|
+
|
239
|
+
Note that this extension only works with the sharded threaded connection
|
240
|
+
pool. If you are using the sharded single connection pool, you need
|
241
|
+
to switch to the sharded threaded connection pool before using this
|
242
|
+
extension. If you are passing the :single_threaded option to
|
243
|
+
the Database, just remove that option. If you are setting:
|
244
|
+
|
245
|
+
Sequel.single_threaded = true
|
246
|
+
|
247
|
+
just remove or comment out that code.
|