great, that test is perfect. I added ticket #1933, I just want to see if I can get the "testtype" to be available somehow before falling back to setting coltype=None solution.
On Sep 30, 2010, at 9:22 AM, Nikolaj wrote: > Sorry I was being a bit lazy and trying to avoid setting up the PG > test environment. The problem affects a domain over a custom type. > Here is a test that exhibits the behaviour (without assertions): > > class DomainOverCustomTypeReflectionTest(TestBase, > AssertsExecutionResults): > __only_on__ = 'postgresql' > > @classmethod > def setup_class(cls): > con = testing.db.connect() > con.execute("CREATE TYPE testtype AS ENUM ('test')") > con.execute('CREATE DOMAIN testdomain AS testtype') > con.execute('CREATE TABLE testtable (question integer, answer > testdomain)') > > @classmethod > def teardown_class(cls): > con = testing.db.connect() > con.execute('DROP TABLE testtable') > con.execute('DROP DOMAIN testdomain') > con.execute('DROP TYPE testtype') > > def test_domain_is_reflected(self): > metadata = MetaData(testing.db) > table = Table('testtable', metadata, autoload=True) > > Thanks, > > N > > On Sep 29, 9:58 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >> On Sep 29, 2010, at 3:37 PM, Nikolaj wrote: >> >> >> >>> Hi there, >> >>> I use the earthdistance and cube modules for PostgreSQL (http:// >>> www.postgresql.org/docs/8.4/interactive/earthdistance.html). These >>> define some custom types and functions for doing great circle >>> calculations. I ran into a problem with table introspection in >>> PGDialect.get_columns(). >> >>> The columns and domains fetched look like this (note that the 'earth' >>> type defined by the earthdistance module has the base type of 'cube' >>> from the cube module): >> >>> rows = [ >>> (u'id', u'integer', u"nextval('mytable_id_seq'::regclass)", True, 1, >>> 161772), >>> (u'created_at', u'timestamp without time zone', None, True, 2, >>> 161772), >>> (u'name', u'character varying(255)', None, True, 3, 161772), >>> (u'lat', u'numeric(10,7)', None, False, 4, 161772), >>> (u'lng', u'numeric(10,7)', None, False, 5, 161772), >>> (u'earth', u'earth', None, False, 6, 161772) >>> ] >> >>> domains = { >>> u'earth': {'attype': u'cube', 'default': None, 'nullable': True}, >>> u'information_schema.cardinal_number': {'attype': u'integer', >>> 'default': None, >>> 'nullable': True}, >>> u'information_schema.character_data': {'attype': u'character >>> varying', >>> 'default': None, >>> 'nullable': True}, >>> u'information_schema.sql_identifier': {'attype': u'character >>> varying', >>> 'default': None, >>> 'nullable': True}, >>> u'information_schema.time_stamp': {'attype': u'timestamp', >>> 'default': >>> u"('now'::text)::timestamp(2) with time zone", >>> 'nullable': True} >>> } >> >>> The problem is that in the loop through the rows in >>> PGDialect.get_columns(), the 'earth' column's attype is in the >>> dictionary of domains, but the domain attype (cube) is not in >>> self.ischema_names. So coltype is never initialized, and it ends up >>> having the value of the previous for loop iteration, causing it to >>> fail with "TypeError: 'NUMERIC' object is not callable" (because the >>> previous iteration ran coltype = coltype(...)). >> >>> The expected behaviour is obviously for `coltype` to become >>> sqltypes.NULLTYPE. It can be solved by initializing coltype = None >>> inside the for loop. >> >> Hi - can you please illustrate a short test for this. I dont work with PG >> domains myself so its not immediately clear to me what this means exactly, >> is it the case that this is a domain of a domain ? if so wouldnt we want >> "cube" to be in the "domains" list as well ? >> >> We have quite a few tests for reflecting types from domains in >> test/dialects/test_postgresql.py so a test would need to be added there once >> a solution is decided upon. >> >> >> >>> Thanks, >> >>> N >> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "sqlalchemy" group. >>> To post to this group, send email to sqlalch...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> sqlalchemy+unsubscr...@googlegroups.com. >>> For more options, visit this group >>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.