Re: flexi adaption/casting scheme

Поиск
Список
Период
Сортировка
От Tobias Oberstein
Тема Re: flexi adaption/casting scheme
Дата
Msg-id 505DBC3D.5060308@gmail.com
обсуждение исходный текст
Ответ на Re: flexi adaption/casting scheme  (Daniele Varrazzo <daniele.varrazzo@gmail.com>)
Ответы Re: flexi adaption/casting scheme  (Daniele Varrazzo <daniele.varrazzo@gmail.com>)
Список psycopg
Am 22.09.2012 03:21, schrieb Daniele Varrazzo:
> On Fri, Sep 21, 2012 at 5:42 PM, Ronan Dunklau <rdunklau@gmail.com> wrote:
>
>> I would  be very happy if it is included in a future release.
>
> I've pushed it into my composite-custom branch. I've mixed our
> designs, refactoring CompositeCaster to allow overriding make(), but
> adding a factory parameter to register_composite() to register the
> subclasses the same way the base class is usually created, without the
> from_db/register methods exposed in my previous patch.
>
> An example of usage is in the docs: see
> https://github.com/dvarrazzo/psycopg/commit/fa9393b5870f07d6fb3ac55f5d90ffd8e06fe678#L1R208
>
> Thank you and Tobias for the input. Testing and comments are welcome.
>
> -- Daniele
>

Hi Daniele,

Ok, I'll do testing combining the recent Json + above stuff together.
Thanks for adding nifty features!

1 thing I stumbled over (not related to above stuff):

the _from_db class method on CompositeCaster takes a name argument and
parsed that into "schema" and "typename".

It uses both to retrieve Oids etc, but then only forwards "typename",
and not "schema" to the CompositeCaster constructor.

If a have 2 composite types defined "public.t_foo" and "bar.t_foo", and
register both, one will be overwritten ..

Can we have "schema" in CompositeCaster also?

Today:

     def __init__(self, name, oid, attrs, array_oid=None):
         self.name = name



Proposed:

     def __init__(self, schema, name, oid, attrs, array_oid=None):
         self.schema = schema
         self.name = name

     @classmethod
     def _from_db(self, name, conn_or_curs):

...

         return CompositeCaster (schema, tname, type_oid, type_attrs,
             array_oid=array_oid)



Alternatively, without breaking the API:

     @classmethod
     def _from_db(self, name, conn_or_curs):

...
         c = CompositeCaster (tname, type_oid, type_attrs,
array_oid=array_oid)
         c.schema = schema
         return c


     def __init__(self, name, oid, attrs, array_oid=None):
         self.name = name
         self.schema = ''
         self.oid = oid
         self.array_oid = array_oid

         self.attnames = [ a[0] for a in attrs ]
         self.atttypes = [ a[1] for a in attrs ]

         fullname = self.schema + self.name

         self._create_type(fullname , self.attnames)
         self.typecaster = new_type((oid,), fullname, self.parse)
         if array_oid:
             self.array_typecaster = new_array_type(
                 (array_oid,), "%sARRAY" % fullname, self.typecaster)
         else:
             self.array_typecaster = None


A third alternative:

     @classmethod
     def _from_db(self, name, conn_or_curs):

...

         # forward name instead of tname !
         return CompositeCaster (name, type_oid, type_attrs,
             array_oid=array_oid)



     def __init__(self, name, oid, attrs, array_oid=None):
...
         # namedtuple's cannot have dots in name ..
         self._create_type(name.replace('.', '_'), self.attnames)
...

====

Personally I'd be fine with all .. they all prohibit clashes with
identically named composite types in different schemata and both provide
the ability to get the fully qualified composite type name in the
CompositeCaster instance.

Cheers,
Tobias


В списке psycopg по дате отправления:

Предыдущее
От: Daniele Varrazzo
Дата:
Сообщение: Re: flexi adaption/casting scheme
Следующее
От: Daniele Varrazzo
Дата:
Сообщение: Re: flexi adaption/casting scheme