From 7aead4d40f5236bfe34857aba412fdac761839c0 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 4 Nov 2007 22:03:40 +0000 Subject: [PATCH] - func. objects can be pickled/unpickled [ticket:844] --- CHANGES | 2 ++ lib/sqlalchemy/sql.py | 8 ++++++++ test/sql/select.py | 5 ++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 973db91da7..12e1782f8d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,6 @@ 0.3.12 +- sql + - func. objects can be pickled/unpickled [ticket:844] - orm - query.get() and related functions (like many-to-one lazyloading) generate randomly-generated bind parameter names, to prevent diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 3367756e2d..4581c987bb 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -2507,8 +2507,16 @@ class _Grouping(ColumnElement): return self.elem._hide_froms() def _get_from_objects(self): return self.elem._get_from_objects() + def __getattr__(self, attr): return getattr(self.elem, attr) + + def __getstate__(self): + return {'elem':self.elem, 'type':self.type} + + def __setstate__(self, state): + self.elem = state['elem'] + self.type = state['type'] class _Label(ColumnElement): """represent a label, as typically applied to any column-level element diff --git a/test/sql/select.py b/test/sql/select.py index 1cf210975c..c543d3c793 100644 --- a/test/sql/select.py +++ b/test/sql/select.py @@ -3,7 +3,7 @@ import testbase from sqlalchemy import * from sqlalchemy.databases import sqlite, postgres, mysql, oracle, firebird, mssql import unittest, re, operator - +import pickle # the select test now tests almost completely with TableClause/ColumnClause objects, # which are free-roaming table/column objects not attached to any database. @@ -568,6 +568,9 @@ FROM mytable, myothertable WHERE foo.id = foofoo(lala) AND datetime(foo) = Today # test None becomes NULL self.runtest(func.my_func(1,2,None,3), "my_func(:my_func, :my_func_1, NULL, :my_func_2)") + # test pickling + self.runtest(pickle.loads(pickle.dumps(func.my_func(1, 2, None, 3))), "my_func(:my_func, :my_func_1, NULL, :my_func_2)") + def testextract(self): """test the EXTRACT function""" self.runtest(select([extract("month", table3.c.otherstuff)]), "SELECT extract(month FROM thirdtable.otherstuff) FROM thirdtable") -- 2.47.2