From: Francis Hwang Date: 2006-03-22T14:13:50+09:00 Subject: [ANN] Lafcadio 0.9.3: PostgreSQL support, eager loading, more The newest development release of Lafcadio, 0.9.3, now supports PostgreSQL, adds eager loading, and has a few more additions. As always, odd-numbered releases should be considered beta. If you want to play it safe, use 0.8.3 instead. http://lafcadio.rubyforge.org/ == What's Lafcadio? == Lafcadio is an object-relational mapping library for use with MySQL. It supports a lot of advanced features, including extensive aid in mapping to legacy databases, in-Ruby triggers, and an advanced query engine that allows you to form queries in Ruby that can be run either against the live database, or an in-memory mock store for testing purposes. I use it in production code on a regular basis, most notably at Rhizome.org, an online community with more than 1 million pageviews a month. == What's new? == = PostgreSQL support = Lafcadio now supports PostgreSQL. Activating is a simple matter of setting 'dbtype' in LafcadioConfig: LafcadioConfig.set_values( 'dbuser' => 'testuser', 'dbpassword' => 'password', 'dbname' => 'test_db', 'dbhost' => 'localhost', 'dbtype' => 'Pg' ) Everything else -- single-row retrieval, transactions, query inference, order and limit clauses -- works transparently across both MySQL and PostgreSQL. = Eager loading = To prevent excessive selects, you can now use eager loading to load across associations with one select statement: all_invoices = Invoice.all( :include => :client ) # Knows Client information without incurring another select all_invoices.first.client.name = MockObjectStore handles transactions = Transaction support was previously added, in 0.9.0, but I forgot to add transaction support to the MockObjectStore. Now that the MockObjectStore mimics the database, you can test transaction-dependent logic in-memory, within having a real database installed. For example, below is a (somewhat stupid) method that uses transactions, with a test-case using the in-memory MockObjectStore: def transfer_money( from_account, to_account, tr_amount ) object_store = Lafcadio::ObjectStore.get_object_store object_store.transaction do |tr| from_account.update!( 'amount' => from_account.amount - tr_amount ) to_account.update!( 'amount' => to_account.amount + tr_amount ) tr.rollback if from_account.amount < 0 end end class TestTransferMoney < Test::Unit::TestCase def test_rollback_if_less_than_zero mock_object_store = MockObjectStore.new ObjectStore.set_object_store mock_object_store from_account = Account.new( 'amount' => 100.0 ).commit to_account = Account.new( 'amount' => 0.0 ).commit transfer_money( from_account, to_account, 200.0 ) from_account_prime = Account[from_account.pk_id] assert_equal( 100.0, from_account_prime.amount ) end end Commits and rollbacks work for the test code, even if you don't have a database installed.