<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Blog II - The Sequel Blog</title>
  <id>http://sequel.heroku.com</id>
  <updated>2013-05-01</updated>
  <author>
    <name>Jeremy Evans</name>
  </author>
  <entry>
    <title>Sequel 3.47.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2013/05/01/sequel-3470-released/"/>
    <id>http://sequel.heroku.com/2013/05/01/sequel-3470-released/</id>
    <published>2013-05-01</published>
    <updated>2013-05-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.47.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_47_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An auto_validations plugin has been added, for automatically adding not null, type, and uniqueness validations&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.47.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_47_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An auto_validations plugin has been added, for automatically adding not null, type, and uniqueness validations.&lt;/li&gt;
&lt;li&gt;An input_transformer plugin has been added, for preprocessing input to model column setters.&lt;/li&gt;
&lt;li&gt;Database.extension has been added, for loading extensions into all future Database instances.&lt;/li&gt;
&lt;li&gt;Model#modified! and #modified? now accept an optional column argument.&lt;/li&gt;
&lt;li&gt;The pg_array extension now allows for Database instance specific array types.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Sequel 4 implementation will begin shortly.  There is still time to &lt;a href="https://github.com/jeremyevans/sequel-4-plans"&gt;review and provide feedback on the implementation plan&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Sequel 3.46.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2013/04/02/sequel-3460-released/"/>
    <id>http://sequel.heroku.com/2013/04/02/sequel-3460-released/</id>
    <published>2013-04-02</published>
    <updated>2013-04-02</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.46.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_46_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Dataset#first!, like #first but raises a NoMatchingRow exception instead of returning nil.&lt;/li&gt;
&lt;li&gt;Added Dataset#with_pk! for model datasets, similar to #first!&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.46.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_46_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Dataset#first!, like #first but raises a NoMatchingRow exception instead of returning nil.&lt;/li&gt;
&lt;li&gt;Added Dataset#with_pk! for model datasets, similar to #first!.&lt;/li&gt;
&lt;li&gt;Added drop_foreign_key to the alter table generator, for easily dropping foreign key constraints.&lt;/li&gt;
&lt;li&gt;Added Support for Microsoft SQL Server CROSS/OUTER APPLY.&lt;/li&gt;
&lt;li&gt;Sped up threaded connection pools when :connection_handling=&gt;:queue is used.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;In other news, Sequel 4 implementation planning has started, &lt;a href="https://github.com/jeremyevans/sequel-4-plans"&gt;please review and provide feedback&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Sequel 3.45.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2013/03/01/sequel-3450-released/"/>
    <id>http://sequel.heroku.com/2013/03/01/sequel-3450-released/</id>
    <published>2013-03-01</published>
    <updated>2013-03-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.45.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_45_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database#transaction now supports a :retry_on option for automatically retrying transaction blocks.&lt;/li&gt;
&lt;li&gt;The json_serializer and xml_serializer plugins are now secure by default&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.45.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_45_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database#transaction now supports a :retry_on option for automatically retrying transaction blocks.&lt;/li&gt;
&lt;li&gt;The json_serializer and xml_serializer plugins are now secure by default.&lt;/li&gt;
&lt;li&gt;Serialization failures are now raised as Sequel::SerializationFailure exceptions.&lt;/li&gt;
&lt;li&gt;Transaction isolation levels are now supported on more databases.&lt;/li&gt;
&lt;li&gt;Metadata parsing on PostgreSQL now correctly handles tables with the same name in multiple schemas.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.44.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2013/02/04/sequel-3440-released/"/>
    <id>http://sequel.heroku.com/2013/02/04/sequel-3440-released/</id>
    <published>2013-02-04</published>
    <updated>2013-02-04</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.44.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_44_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset#paged_each has been added for processing large datasets without keeping all rows in memory.&lt;/li&gt;
&lt;li&gt;Constraint violations in the database are now raised as specific Sequel::ConstraintViolation subclass instances&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.44.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_44_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset#paged_each has been added for processing large datasets without keeping all rows in memory.&lt;/li&gt;
&lt;li&gt;Constraint violations in the database are now raised as specific Sequel::ConstraintViolation subclass instances.&lt;/li&gt;
&lt;li&gt;Performance has been increased in a number of different areas.&lt;/li&gt;
&lt;li&gt;The columns_introspection extension can now introspect more cases.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.43.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2013/01/08/sequel-3430-released/"/>
    <id>http://sequel.heroku.com/2013/01/08/sequel-3430-released/</id>
    <published>2013-01-08</published>
    <updated>2013-01-08</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.43.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_43_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new core_refinements extension for ruby 2.0 refinement versions of the core extensions.&lt;/li&gt;
&lt;li&gt;A date_arithmetic extension for database-independent date calculations&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.43.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_43_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new core_refinements extension for ruby 2.0 refinement versions of the core extensions.&lt;/li&gt;
&lt;li&gt;A date_arithmetic extension for database-independent date calculations.&lt;/li&gt;
&lt;li&gt;Dataset#get can now take an array of expressions to get an array of values.&lt;/li&gt;
&lt;li&gt;The jdbc adapter now supports the format of the new jdbc-* gems.&lt;/li&gt;
&lt;li&gt;Dataset#hash and Model#hash are now significantly faster.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.42.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/12/03/sequel-3420-released/"/>
    <id>http://sequel.heroku.com/2012/12/03/sequel-3420-released/</id>
    <published>2012-12-03</published>
    <updated>2012-12-03</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.42.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_42_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset #sum, #avg, #min, #max, #range, and #interval methods now accept virtual row blocks.&lt;/li&gt;
&lt;li&gt;Database#do has been added on PostgreSQL for anonymous procedural language function execution&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.42.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_42_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset #sum, #avg, #min, #max, #range, and #interval methods now accept virtual row blocks.&lt;/li&gt;
&lt;li&gt;Database#do has been added on PostgreSQL for anonymous procedural language function execution.&lt;/li&gt;
&lt;li&gt;Database#copy_table and #copy_into are now supported on jdbc/postgres.&lt;/li&gt;
&lt;li&gt;Sequel now supports deferred constraints on PostgreSQL and Oracle.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.41.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/11/01/sequel-3410-released/"/>
    <id>http://sequel.heroku.com/2012/11/01/sequel-3410-released/</id>
    <published>2012-11-01</published>
    <updated>2012-11-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.41.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_41_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A connection_validator extension has been added to transparently handle disconnected database connections.&lt;/li&gt;
&lt;li&gt;Sequel.delay has been added for generic delayed execution&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.41.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_41_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A connection_validator extension has been added to transparently handle disconnected database connections.&lt;/li&gt;
&lt;li&gt;Sequel.delay has been added for generic delayed execution.&lt;/li&gt;
&lt;li&gt;Uniqueness validation now correctly handles nil values.&lt;/li&gt;
&lt;li&gt;Foreign key parsing is now supported on Microsoft SQL Server.&lt;/li&gt;
&lt;li&gt;Sequel now treats clob columns as strings instead of blobs.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.40.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/09/26/sequel-3400-released/"/>
    <id>http://sequel.heroku.com/2012/09/26/sequel-3400-released/</id>
    <published>2012-09-26</published>
    <updated>2012-09-26</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.40.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_40_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sequel has vastly improved support for Microsoft Access.&lt;/li&gt;
&lt;li&gt;Sequel now supports the CUBRID database.&lt;/li&gt;
&lt;li&gt;The association_pks plugin now supports composite keys.&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.40.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_40_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sequel has vastly improved support for Microsoft Access.&lt;/li&gt;
&lt;li&gt;Sequel now supports the CUBRID database.&lt;/li&gt;
&lt;li&gt;The association_pks plugin now supports composite keys.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.39.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/09/01/sequel-3390-released/"/>
    <id>http://sequel.heroku.com/2012/09/01/sequel-3390-released/</id>
    <published>2012-09-01</published>
    <updated>2012-09-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.39.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_39_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A constraint_validations extension and plugin have been added for validations enforced by database constraints&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.39.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_39_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A constraint_validations extension and plugin have been added for validations enforced by database constraints.&lt;/li&gt;
&lt;li&gt;Dataset#count now accepts an argument to easily allow count(expression)&lt;/li&gt;
&lt;li&gt;Database#copy_into has been added to the postgres adapter for very fast inserts into tables using COPY.&lt;/li&gt;
&lt;li&gt;Sequel now parses current date/timestamp default column values fro parsing the schema for a table.&lt;/li&gt;
&lt;li&gt;On MySQL and PostgreSQL, Sequel can now combine multiple alter_table operations into a single query.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.38.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/08/01/sequel-3380-released/"/>
    <id>http://sequel.heroku.com/2012/08/01/sequel-3380-released/</id>
    <published>2012-08-01</published>
    <updated>2012-08-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.38.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_38_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A pg_row extension has been added to support PostgreSQL row-valued/composite types.&lt;/li&gt;
&lt;li&gt;A pg_row_ops extension has been added for DSL support of PostgreSQL row-valued/composite types&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.38.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_38_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A pg_row extension has been added to support PostgreSQL row-valued/composite types.&lt;/li&gt;
&lt;li&gt;A pg_row_ops extension has been added for DSL support of PostgreSQL row-valued/composite types.&lt;/li&gt;
&lt;li&gt;A pg_row plugin has been added for representing PostgreSQL composite types as Sequel::Model objects.&lt;/li&gt;
&lt;li&gt;Sequel.expr now splits symbols instead of just wrapping them.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.37.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/07/02/sequel-3370-released/"/>
    <id>http://sequel.heroku.com/2012/07/02/sequel-3370-released/</id>
    <published>2012-07-02</published>
    <updated>2012-07-02</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.37.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_37_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database#extension and Dataset#extension were added for easier extension usage.&lt;/li&gt;
&lt;li&gt;Dataset join methods now respect a :qualify=&gt;:deep option for automatic deep qualification of conditions&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.37.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_37_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database#extension and Dataset#extension were added for easier extension usage.&lt;/li&gt;
&lt;li&gt;Dataset join methods now respect a :qualify=&gt;:deep option for automatic deep qualification of conditions.&lt;/li&gt;
&lt;li&gt;All of Sequel&amp;rsquo;s model associations can now use arbitrary expressions as keys/join conditions.&lt;/li&gt;
&lt;li&gt;The pg_array extension has been made much more generic, and supports a wider number of array types.&lt;/li&gt;
&lt;li&gt;A pg_range extension has been added for dealing with PostgreSQL 9.2+ range types.&lt;/li&gt;
&lt;li&gt;A pg_interval extension has been added for returning intervals as ActiveSupport::Duration instances.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.36.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/06/01/sequel-3360-released/"/>
    <id>http://sequel.heroku.com/2012/06/01/sequel-3360-released/</id>
    <published>2012-06-01</published>
    <updated>2012-06-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.36.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_36_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An eager_each plugin was added, making Dataset#each on a eager loaded dataset do eager loading.&lt;/li&gt;
&lt;li&gt;The nested_attributes plugin now supports composite primary keys&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.36.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_36_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An eager_each plugin was added, making Dataset#each on a eager loaded dataset do eager loading.&lt;/li&gt;
&lt;li&gt;The nested_attributes plugin now supports composite primary keys.&lt;/li&gt;
&lt;li&gt;A pg_json extension has been added for dealing with PostgreSQL 9.2&amp;rsquo;s json type.&lt;/li&gt;
&lt;li&gt;A pg_inet extension has been added for dealing with PostgreSQL&amp;rsquo;s inet and cidr types.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.35.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/05/01/sequel-3350-released/"/>
    <id>http://sequel.heroku.com/2012/05/01/sequel-3350-released/</id>
    <published>2012-05-01</published>
    <updated>2012-05-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.35.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_35_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many thread-safety issues were fixed on ruby implementations that don&amp;rsquo;t use a global interpreter lock.&lt;/li&gt;
&lt;li&gt;A dirty plugin was added for getting original values of columns after changing the columns&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.35.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_35_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many thread-safety issues were fixed on ruby implementations that don&amp;rsquo;t use a global interpreter lock.&lt;/li&gt;
&lt;li&gt;A dirty plugin was added for getting original values of columns after changing the columns.&lt;/li&gt;
&lt;li&gt;Database#create_table now respects an :as option for creating a table from a dataset.&lt;/li&gt;
&lt;li&gt;The features deprecated in 3.34.0 have been removed.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.34.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/04/02/sequel-3340-released/"/>
    <id>http://sequel.heroku.com/2012/04/02/sequel-3340-released/</id>
    <published>2012-04-02</published>
    <updated>2012-04-02</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.34.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_34_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added pg_array and pg_array_ops extensions for dealing with PostgreSQL arrays.&lt;/li&gt;
&lt;li&gt;Added pg_hstore and pg_hstore_ops extensions for dealing with PostgreSQL hstores&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.34.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_34_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added pg_array and pg_array_ops extensions for dealing with PostgreSQL arrays.&lt;/li&gt;
&lt;li&gt;Added pg_hstore and pg_hstore_ops extensions for dealing with PostgreSQL hstores.&lt;/li&gt;
&lt;li&gt;Added pg_auto_parameterize and pg_statement_cache extensions for automatically parameterizing and preparing queries.&lt;/li&gt;
&lt;li&gt;Added query_literals extension for more easily using literal strings with placeholders in select/group/order methods.&lt;/li&gt;
&lt;li&gt;Added select_remove extension for removing selected columns/expressions from a dataset.&lt;/li&gt;
&lt;li&gt;Added schema_caching extension for writing and reading schema metadata from a file instead of parsing it from the database.&lt;/li&gt;
&lt;li&gt;Added null_dataset extension to return a dataset that will not issue a database query.&lt;/li&gt;
&lt;li&gt;Added static_cache plugin for caching an entire model staticly.&lt;/li&gt;
&lt;li&gt;Added many_to_one_pk_lookup plugin for speeding up most many_to_one association lookups.&lt;/li&gt;
&lt;li&gt;Added replacements for most of Sequel&amp;rsquo;s core extensions to the Sequel module.&lt;/li&gt;
&lt;li&gt;Expanded virtual row support to include operators and literal strings.&lt;/li&gt;
&lt;li&gt;Added the ability to require sequel/no_core_ext to require Sequel without the core extensions.&lt;/li&gt;
&lt;li&gt;Supported foreign keys in the schema dumper.&lt;/li&gt;
&lt;li&gt;Added Dataset#to_hash_groups for returning a hash categorized by a field, with an array of all matching values.&lt;/li&gt;
&lt;li&gt;Model#set_fields and #update_fields now support :missing=&gt;:skip and :missing=&gt;:raise options.&lt;/li&gt;
&lt;li&gt;Added Database#drop_table? for only dropping a table if it already exists.&lt;/li&gt;
&lt;li&gt;Added Database#create_join_table for easily creating many_to_many join tables.&lt;/li&gt;
&lt;li&gt;Added Model#freeze for making an model instance read-only.&lt;/li&gt;
&lt;li&gt;Made numerous performance improvements, including doubling the speed of model lookups by primary key.&lt;/li&gt;
&lt;li&gt;Deprecated support for Ruby &amp;lt;1.8.7, PostgreSQL &amp;lt;8.2, and disable_insert_returning on PostgreSQL.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Automatic Parameterization and Statement Caching</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/03/03/automatic-parameterization-and-statement-caching/"/>
    <id>http://sequel.heroku.com/2012/03/03/automatic-parameterization-and-statement-caching/</id>
    <published>2012-03-03</published>
    <updated>2012-03-03</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;I recently committed some patches that add support for &lt;a href="https://github.com/jeremyevans/sequel/commit/c467b8397420912969d75f3ab6589eb2e09a0d94"&gt;automatic parameterization of queries&lt;/a&gt; and &lt;a href="https://github.com/jeremyevans/sequel/commit/cbfa4e9315e900192ca6eab97af38b13cea6cd0a"&gt;caching and automatic preparation of statements&lt;/a&gt; when Sequel&amp;rsquo;s postgres adapter is used with the pg driver.  These extensions significantly change how Sequel generates and executes queries, and can improve performance in some cases&amp;hellip;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;I recently committed some patches that add support for &lt;a href="https://github.com/jeremyevans/sequel/commit/c467b8397420912969d75f3ab6589eb2e09a0d94"&gt;automatic parameterization of queries&lt;/a&gt; and &lt;a href="https://github.com/jeremyevans/sequel/commit/cbfa4e9315e900192ca6eab97af38b13cea6cd0a"&gt;caching and automatic preparation of statements&lt;/a&gt; when Sequel&amp;rsquo;s postgres adapter is used with the pg driver.  These extensions significantly change how Sequel generates and executes queries, and can improve performance in some cases.&lt;/p&gt;

&lt;h3&gt;Historical Behavior&lt;/h3&gt;

&lt;p&gt;First, let&amp;rsquo;s review Sequel&amp;rsquo;s default behavior.  Unless you are &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/prepared_statements_rdoc.html"&gt;specifically choosing to use prepared statements&lt;/a&gt;, Sequel by defaults literalizes all arguments directly into the SQL query string.  For example, this Sequel code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DB[:table].where(:a=&amp;gt;1, :b=&amp;gt;"c")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;will use SQL similar to the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT * FROM table WHERE ((a = 1) AND (b = 'c'))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, another way to execute this query would be to use placeholders for the values:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT * FROM table WHERE ((a = $1) AND (b = $2)) -- args [1, "c"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Previously, you had to use Sequel&amp;rsquo;s prepared statement API to use placeholders:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DB[:table].where(:a=&amp;gt;:$a, :b=&amp;gt;:$b).call(:select, :a=&amp;gt;1, :b=&amp;gt;"c")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As that API is more cumbersome to use, it is used less frequently.&lt;/p&gt;

&lt;p&gt;Historically, Sequel&amp;rsquo;s internals have not been friendly to the usage of prepared statements.  &lt;a href="https://github.com/jeremyevans/sequel/commit/78a683d97fb6a58cf8ed83777d097b49e8130056"&gt;Prepared statements and bound variables weren&amp;rsquo;t supported at all until 2.4&lt;/a&gt;, and as Sequel was not designed with the usage of bound variables/query parameters in mind, the internals were/are clunky, and the API for using them is suboptimal.  While I still think that the API chosen was the best one considering the existing codebase, I&amp;rsquo;ve always wished for a nicer way to implement them.&lt;/p&gt;

&lt;h3&gt;Dataset Literalization Refactoring&lt;/h3&gt;

&lt;p&gt;With the &lt;a href="https://github.com/jeremyevans/sequel/commit/092905dea17e1c800e5c6af6c38ff4997d0bdf8f"&gt;dataset literalization refactoring done between 3.29 and 3.30&lt;/a&gt;, I finally had a nicer way.  Unlike &lt;a href="https://github.com/rails/arel/blob/master/lib/arel/visitors/to_sql.rb"&gt;ActiveRecord/ARel&lt;/a&gt;, Sequel has never used a separate visitor class to build an SQL string, it has done literalization directly in its dataset class, passing an SQL string to a bunch of query-building methods.  As Sequel datasets need to be thread-safe, the literalization process cannot modify the dataset in any way, and could only operate on the string, so there was no place to store any query parameters.  Before the dataset literalization refactoring, the string that represented the query wasn&amp;rsquo;t necessarily a consistent object.  For example, Sequel used to do something similar the following to add the WHERE clause to the SQL string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sql &amp;lt;&amp;lt; " WHERE #{literal(opts[:where])}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So inside the literal method, there was no way to access the string being built for the query, or any way to pass the query parameters.&lt;/p&gt;

&lt;p&gt;The dataset literalization refactoring changed this type of code to something similar to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sql &amp;lt;&amp;lt; " WHERE "
literal_append(sql, opts[:where])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So after the refactoring, all query building methods had access to the string being built.  However, while all the query methods had access to the string, there still was no place to store query parameters.  The usual way to handle this in ruby would be to store the query parameters in an instance variable, but since the instance is a dataset and datasets need to be thread-safe, you can&amp;rsquo;t do that.  Even if you could work around the thread-safety issues, you&amp;rsquo;d have to have special code to deal with subselects (which could contain query parameters), and a whole bunch of other issues.&lt;/p&gt;

&lt;p&gt;Thankfully, ruby is a flexible language, and it gives us a place to store the query parameters, even if it isn&amp;rsquo;t obvious.  Instead of using a plain string to store the query, Sequel&amp;rsquo;s pg_auto_parameterize extension uses a string subclass with an instance variable for storing the parameters.  Since a unique query string object is created each time a query needs to be built and this object is passed to all methods that are used to build the query, this works out well.  Sequel just needs to override a single method (literal_append), so that instead of appending a literal version of the object into the query, it appends a placeholder to the query and adds the object as one of the query parameters.&lt;/p&gt;

&lt;h3&gt;Literalization vs. Parameterization&lt;/h3&gt;

&lt;p&gt;Most ruby ORMs have historically used literalization as the primary if not the only way of executing queries.  While Sequel added support for parameterization with the bound variable/prepared statement API added in Sequel 2.4 in 2008, ActiveRecord didn&amp;rsquo;t add support for parameterization at all until 3.1 in 2011.&lt;/p&gt;

&lt;p&gt;In some other database communities, parameterization is thought of as the only correct way to do things, with literalization scoffed at and considered slow and less secure.  I don&amp;rsquo;t necessarily agree that parameterization is better in all cases, though there are certainly use cases that benefit from it.&lt;/p&gt;

&lt;p&gt;In my opinion, the main benefit of parameterization is not using parameters over literalization, but the fact that using parameters normalizes the SQL string being executed, allowing more opportunities for optimization.  For example, with the following Sequel code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DB[:table].where(:a=&amp;gt;1, :b=&amp;gt;"c")
DB[:table].where(:a=&amp;gt;2, :b=&amp;gt;"d")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With literalization you get:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT * FROM table WHERE ((a = 1) AND (b = 'c'))
SELECT * FROM table WHERE ((a = 2) AND (b = 'd'))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While with parameterization you get:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT * FROM table WHERE ((a = $1) AND (b = $2)) -- args [1, "c"]
SELECT * FROM table WHERE ((a = $1) AND (b = $2)) -- args [2, "d"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Statement Caching and Automatic Preparation&lt;/h3&gt;

&lt;p&gt;As you may notice in the previous example, the same statement is used for both of the lines of Sequel code, with only the arguments differing.  Wouldn&amp;rsquo;t it be great if we could use a prepared statement in that case, so the database doesn&amp;rsquo;t have to parse and plan the same statement multiple times?&lt;/p&gt;

&lt;p&gt;It turns out, that&amp;rsquo;s pretty easy to do in the naive case.  You just use a hash keyed on the sql string, with the value being some object representing the prepared statement.  However, because the library doesn&amp;rsquo;t know in advance which statements will be executed, you need to have some upper bound on the number of statements to prepare.  Also, when the cache is full, there needs to be some algorithm to determine which statements to keep in the cache and which statements to remove from the cache.  The most naive way to do that is just to keep the most recently executed statements in the cache, assuming that statements executed recently are most likely to be needed in the future, making it an LRU (least recently used) cache.&lt;/p&gt;

&lt;p&gt;Sequel&amp;rsquo;s pg_statement_cache extension implements a less naive cache, which considers both the last time a query was executed and the number of times it has been executed.  The assumption that Sequel makes is that it is better to remove more recently executed statements that haven&amp;rsquo;t been executed as frequently from the cache and to keep statements that have not been executed as recently but have been executed more frequently in the past.  Note that this is still a fairly naive algorithm.  A more intelligent algorithm would take into account the cost it takes to parse and plan the literalized version of the query, but there isn&amp;rsquo;t a good way for Sequel to do that, and even if there was, doing so may cost more in computation time than the time saved.&lt;/p&gt;

&lt;p&gt;Another issue when dealing with a query cache is deciding when to prepare the statements.  The most naive way to do this is just to prepare all queries to be executed, but this causes a performance hit when you only want to execute a query a single time.  It would be best to know in advance which queries need to be executed multiple times, and only prepare those queries, but automatic statement preparation generally cannot do that.  By default, Sequel chooses to prepare any query that needs to be executed multiple times.  So the first time Sequel sees a query, it will execute it normally, but the second time, it will prepare the statement and then execute it.&lt;/p&gt;

&lt;p&gt;The other consideration when constructing the cache is deciding when to clean up the statements.  The most naive way to do this is that when you want to add an item to the cache and it is already full, just remove the least important item and insert the new item.  Unfortunately, depending on the algorithm and data structure used, determining the least important item can involve a fairly expensive computation.  In Sequel&amp;rsquo;s case, this is true, as determining the least important item involves iterating over all of the items in the cache and running a computation on each item to determine the estimated value of the statements, sorting the statements by the resulting values, and removing the least valuable statements.  When the cache is full, doing this each time you wanted to insert an item would result in suboptimal performance.&lt;/p&gt;

&lt;p&gt;Sequel uses a fairly simple design decision to lessen the performance impact of cleaning up the cache.  Instead of cleaning the cache every time you want to add an item, when it cleans the cache, it removes the least valuable half of the statements.  By default, Sequel sets the maximum size of the cache to 1000 statements, and when it cleans up the cache, it removes the 500 least valuable statements.  So it only has to take the performance hit of cleaning the cache occasionally, amortizing the at least O(n*log(n)) cost of determining the estimated value of the statements over n/2 statements.  There are some trade offs with this method, though, in that if you have let&amp;rsquo;s say 3n/4 important queries that are executed a lot, with a bunch of other queries that are only executed occasionally, when it comes time to clean the cache, it will probably remove about 1/3 of your important queries from the cache.&lt;/p&gt;

&lt;p&gt;Because there is no one configuration of a statement cache that works well for all applications, Sequel allows multiple ways to configure the statement cache.  It allows you to set the maximum size of the cache as well as the minimum size of the cache, which is the size the cache should be after cleaning it.  The difference between the maximum and the minimum sizes is the number of statements to remove when cleaning the cache.  So in the above case where 3n/4 items are important, you would probably want a minimum size of at least 4n/5, so it wouldn&amp;rsquo;t remove any of the important statements when cleaning the cache.  To avoid unnecessarily preparing statements that will not be used frequently, you can set the number of times to execute a statement normally before preparing it.  Finally, you can provide your own algorithm for assigning estimated values to statements, overriding the default.  The combination of these options should be enough to handle most use cases.&lt;/p&gt;

&lt;h3&gt;Differences from ActiveRecord&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L325"&gt;ActiveRecord 3.1+ appears to use automatic parameterization and statement caching similar to the new extensions I&amp;rsquo;ve added&lt;/a&gt;.  ActiveRecord&amp;rsquo;s statement cache uses a much simpler design than Sequel&amp;rsquo;s.  When the cache reaches the maximum size, ActiveRecord &lt;a href="https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L342"&gt;removes a statement using Hash#shift&lt;/a&gt; (so I was wrong that the most naive way was an LRU cache).  This avoids a the need for a low water mark (the minimum pool size) and an possibly expensive algorithm to determine statement value, and honestly might be a better design in terms of performance.  It mostly depends on the cost of repreparing the same statement in PostgreSQL versus the cost of executing ruby code.  As the cost of preparing statements is very database and statement specific, it&amp;rsquo;s hard to say which statement cache design is better, though certainly for simple databases and statements, I suspect ActiveRecord&amp;rsquo;s is.&lt;/p&gt;

&lt;p&gt;ActiveRecord&amp;rsquo;s statement cache also differs from Sequel&amp;rsquo;s in that it &lt;a href="https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L1296"&gt;prepares all statements&lt;/a&gt;, where Sequel by default prepares a statement only when it will be executed multiple times (though you can configure Sequel to prepare all queries).&lt;/p&gt;

&lt;p&gt;As far as I know, ActiveRecord has not yet added a public API for creating and executing arbitrary prepared statements in a way similar to Sequel&amp;rsquo;s prepared statement API (where the SQL is only built once and just executed repeatedly with different arguments).&lt;/p&gt;

&lt;h3&gt;Caveats&lt;/h3&gt;

&lt;p&gt;Automatic parameterization on PostgreSQL currently uses type specifiers for all placeholders, guessing at which database type to use.  If it guesses incorrectly, PostgreSQL will complain and an exception will be raised when you attempt to execute the query.  These issues are generally simple to fix by adding an explicit cast yourself.&lt;/p&gt;

&lt;p&gt;Automatic parameterization on PostgreSQL currently has almost no context, so it can&amp;rsquo;t tell what a given ruby object really represents in SQL.  It assumes when you give it an integer, it represents a integer in the database.  However, you can do the following in SQL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT id, name FROM table ORDER BY 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In Sequel code, that would be:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DB[:table].select(:id, :name).order(1)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Unfortunately, automatic parameterization will turn that into:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT id, name FROM table ORDER BY $1 -- args [1]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;PostgreSQL complains about such a query, since you can&amp;rsquo;t use query parameters to change how the query is ordered.  You can switch to using the column names or use a literal string to work around that issue.&lt;/p&gt;

&lt;p&gt;Statement caching doesn&amp;rsquo;t have many gotchas, except that if you modify a table used by a prepared statement in such a way that it changes the columns the query would return, PostgreSQL will raise an error.  As that&amp;rsquo;s generally not done in production, it shouldn&amp;rsquo;t be a major issue for users.&lt;/p&gt;

&lt;h3&gt;Performance&lt;/h3&gt;

&lt;p&gt;What might surprise some people that aren&amp;rsquo;t very familiar with PostgreSQL performance is that automatically parameterizing and caching statements is not necessary faster than Sequel&amp;rsquo;s default literalization behavior, even if all you do is execute the statement over and over.  Here&amp;rsquo;s some stupid benchmark results taken from a local database:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Literalization                                                       real
SELECT * FROM table WHERE pk = integer LIMIT 1                     (  5.613807)
SELECT * FROM table WHERE column = 118 character string LIMIT 1    (  6.045027)
2 Table Join                                                       (  4.557464)
3 Table Join                                                       (  4.638113)
9 Table Join                                                       (  4.962573)

# Automatic Parameterization                                           real
SELECT * FROM table WHERE pk = integer LIMIT 1                     (  6.889978)
SELECT * FROM table WHERE column = 118 character string LIMIT 1    (  6.964313)
2 Table Join                                                       (  5.034440)
3 Table Join                                                       (  5.258987)
9 Table Join                                                       (  5.568579)

# Automatic Parameterization and Statement Caching                     real
SELECT * FROM table WHERE pk = integer LIMIT 1                     (  7.156773)
SELECT * FROM table WHERE column = 118 character string LIMIT 1    (  7.375706)
2 Table Join                                                       (  4.532341)
3 Table Join                                                       (  3.063554)
9 Table Join                                                       (  2.439051)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As one might expect, for more complex queries, there is a benefit, but for simple queries, performance is actually worse. Why is this?  Well, I haven&amp;rsquo;t had time to fully analyze the reasons, but my guess is the overhead of automatically parameterizing and caching statements in Ruby exceeds the time saved in PostgreSQL.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s not difficult to modify the pg_auto_parameterize extension so that only queries that join multiple tables (or meet some other arbitrary criteria) do automatic parameterization and statement caching.  However, optimizations like that are best applied on a per-application basis (the results you see here may not be reflective of a real world application).&lt;/p&gt;

&lt;p&gt;For comparison, here are results using Sequel&amp;rsquo;s prepared statement API:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT * FROM table WHERE pk = integer LIMIT 1                     (  3.172460)
SELECT * FROM table WHERE column = 118 character string LIMIT 1    (  3.268584)
2 Table Join                                                       (  2.882885)
3 Table Join                                                       (  1.173159)
9 Table Join                                                       (  1.753078)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It appears there are substantial benefits from preparing even simple queries in Sequel. I suspect this is because when using Sequel&amp;rsquo;s prepared statement API, Sequel only has to create the SQL string once, and each time you call it,  Sequel more or less just passes the hash of arguments directly to the already prepared statement, so there is much less ruby code executed.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not providing either the data or the benchmark code I used on purpose.  The only thing that should matter is how it performs on your application, and the only way to know that is to try it out yourself (and report in the comments).&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;As currently implemented, automatic parameterization and statement caching does not necessarily improve performance. Using Sequel&amp;rsquo;s prepared statement API manually seems to be fastest, but the prepared statement API is slightly more verbose and slightly less flexible.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Sequel 3.33.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/03/01/sequel-3330-released/"/>
    <id>http://sequel.heroku.com/2012/03/01/sequel-3330-released/</id>
    <published>2012-03-01</published>
    <updated>2012-03-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.33.0 was released today!  &lt;a href="https://raw.github.com/jeremyevans/sequel/master/doc/release_notes/3.33.0.txt"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A server_block extension has been added that scopes database access inside a block to a given server/shard&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.33.0 was released today!  &lt;a href="https://raw.github.com/jeremyevans/sequel/master/doc/release_notes/3.33.0.txt"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A server_block extension has been added that scopes database access inside a block to a given server/shard.&lt;/li&gt;
&lt;li&gt;An arbitrary_servers extension has been added that allows you to connect to arbitrary shards/servers.&lt;/li&gt;
&lt;li&gt;You can now use 1/0 for booleans in the sqlite adapter, instead of &amp;rsquo;t'/&amp;lsquo;f&amp;rsquo;.&lt;/li&gt;
&lt;li&gt;You can now disable transaction use in migrations on a per-migration basis.&lt;/li&gt;
&lt;li&gt;Foreign key creation now works without specifying the primary key column manually on MySQL/InnoDB.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.32.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/02/01/sequel-3320-released/"/>
    <id>http://sequel.heroku.com/2012/02/01/sequel-3320-released/</id>
    <published>2012-02-01</published>
    <updated>2012-02-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.32.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_32_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prepared statements nows support :map/:to_hash types.&lt;/li&gt;
&lt;li&gt;NOT IN handling with an empty array has changed in regards to NULL values&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.32.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_32_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prepared statements nows support :map/:to_hash types.&lt;/li&gt;
&lt;li&gt;NOT IN handling with an empty array has changed in regards to NULL values.&lt;/li&gt;
&lt;li&gt;You can now define associations that use columns that clash with ruby method names by specifying additional options.&lt;/li&gt;
&lt;li&gt;You can now use models with prepared transactions by disabling after_commit/after_rollback.&lt;/li&gt;
&lt;li&gt;Filtering/excluding by assocations now uses qualified identifiers, so it works even if you do your own joins.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.31.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2012/01/03/sequel-3310-released/"/>
    <id>http://sequel.heroku.com/2012/01/03/sequel-3310-released/</id>
    <published>2012-01-03</published>
    <updated>2012-01-03</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.31.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_31_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The serialization plugin now accepts custom serialization formats.&lt;/li&gt;
&lt;li&gt;Dataset #import/#multi_insert can now return an array of inserted primary key values&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.31.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_31_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The serialization plugin now accepts custom serialization formats.&lt;/li&gt;
&lt;li&gt;Dataset #import/#multi_insert can now return an array of inserted primary key values.&lt;/li&gt;
&lt;li&gt;You can now have a many_to_one assocation with the same name as the foreign key column.&lt;/li&gt;
&lt;li&gt;GROUP BY ROLLBACK/CUBE is now supported via the Dataset #group_rollup and #group_cube options.&lt;/li&gt;
&lt;li&gt;Dataset #exists and #full_text_search now work with prepared statement placeholders.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.30.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2011/12/01/sequel-3300-released/"/>
    <id>http://sequel.heroku.com/2011/12/01/sequel-3300-released/</id>
    <published>2011-12-01</published>
    <updated>2011-12-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.30.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_30_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset literalization has been refactored completely, improving performance.&lt;/li&gt;
&lt;li&gt;Type conversion in the JDBC adapter is much faster&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.30.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_30_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset literalization has been refactored completely, improving performance.&lt;/li&gt;
&lt;li&gt;Type conversion in the JDBC adapter is much faster.&lt;/li&gt;
&lt;li&gt;Literalization of hex-encoded blobs is much faster.&lt;/li&gt;
&lt;li&gt;Sequel::Model now has basic sharding support built in.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Sequel 3.29.0 Released</title>
    <link rel="alternate" href="http://sequel.heroku.com/2011/11/01/sequel-3290-released/"/>
    <id>http://sequel.heroku.com/2011/11/01/sequel-3290-released/</id>
    <published>2011-11-01</published>
    <updated>2011-11-01</updated>
    <author>
      <name>Jeremy Evans</name>
    </author>
    <summary type="html">&lt;p&gt;Sequel 3.29.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_29_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle support has been improved greatly.&lt;/li&gt;
&lt;li&gt;Support has been added for the HSQLDB and Apache Derby Java databases&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;Sequel 3.29.0 was released today!  &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_29_0_txt.html"&gt;Full release notes are available&lt;/a&gt;, but here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle support has been improved greatly.&lt;/li&gt;
&lt;li&gt;Support has been added for the HSQLDB and Apache Derby Java databases.&lt;/li&gt;
&lt;li&gt;The db2 adapter has been improved significantly.&lt;/li&gt;
&lt;li&gt;A mock adapter has been added for better testing support.&lt;/li&gt;
&lt;li&gt;Many transaction related features have been added, such as after commit/rollback hooks.&lt;/li&gt;
&lt;li&gt;A dataset_associations plugin has been added, allowing association methods to be called on datasets.&lt;/li&gt;
&lt;li&gt;Database#extend_datasets has been added, allowing you to fully customize the datasets for a database.&lt;/li&gt;
&lt;li&gt;Database#timezone has been added, so you can set Sequel.database_timezone per database.&lt;/li&gt;
&lt;li&gt;Numerous optimizations have been made to speed up loading of model objects from the database.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
</feed>
