raf wrote:
> Christoph Zwerschke wrote:
>
> Sorry for the delay in responding.
>
> > Am 23.08.2016 um 06:57 schrieb raf:
> > >Here's a little program to demonstrate:
> > >
> > > #!/usr/bin/env python
> > > import pgdb
> > > connection = pgdb.connect(host='XXX', database='XXX', user='XXX',
> > > password='XXX')
> > > cursor = connection.cursor()
> > > cursor.execute("select cast('[2:2]={1}' as integer[])")
> > > rows = cursor.fetchall()
> > > print('%r' % rows[0][0])
> > > # pygresql-4.2.2 outputs '[2:2]={1}' (which then needs to be parsed)
> > > # pygresql-5.0.1 outputs [1] (which should be [None, 1])
> >
> > Why do you think this should be [None, 1]?
>
> The postgres array '[2:2]={1}' has the value 1 at index 1.
> Therefore, the corresponding python list must have the value 1
> at index 0.
The above is wrong of course. I meant:
The postgres array '[2:2]={1}' has the value 1 at index 2.
Therefore, the corresponding python list must have the value 1
at index 1.
> Since the first index in the postgres array is 2
> (rather than 1), the value in the corresponding python list at
> index 0 should be None. This corresponds to the fact that if you
> select the (non-existant) item at index 1 from that array, you
> will receive null/None.
>
> > The expression "[2:2]={1}" actually describes an array with ONE element,
> > "1". This translates into a list with ONE element in Python.
>
> It may well be an array with one element but that element is at index 2
> (where indexes start with 1 rather than 0). That's what the "[2:2]="
> means at the front. That is what it has always meant. You can't just
> disregard that vitally important piece of information. It is vital
> to the structure of the data.
>
> > The "[2:2]=" prefix only says that Postgres should use the start and end
> > index 2 for that index, but that's only for accessing the array internally
> > in Postgres and does not translate to Python, since Python lists always have
> > the start index 0.
>
> That's a surpringingly unhelpful point of view. If a Postgres
> array has a value in item n then the python equivalent of that
> array must have the same value in item n-1. To think otherwise
> is madness. It's like saying that the position in an array is
> meaningless. It really isn't.
>
> Look, even postgres agrees with me:
>
> select cast('[2:2]={1}' as integer[]) = cast('{1}' as integer[])
> ?column?
> ----------
> f
> (1 row)
>
> See, they're are not the same thing. :-)
>
> > Note that using this prefix you can only change the
> > index, not magically add NULL elements.
> >
> > (cast('[2:2]={1}' as integer[]))[2] --> 1
> > array_length(cast('[2:2]={1}' as integer[]), 1) --> 1
>
> Yes, but if you have a table column caled "a" whose type is
> integer[] and you set the 2nd item to 1, then the value in that
> column will be '[2:2]={1}' but you can still select a[1] and get
> null. So, postgres effectively "magically" adds the null. It just
> doesn't bother storing it. In python we have to store it because
> indexes all start at zero.
>
> You say above that the index notation doesn't translate to Python.
> I'm ssaying that it absolutelu has to translate to Python. If not,
> it's indistinguishable from data corruption (just a lot more consistent).
>
> > As you see, the actual array has still only one item even in Postgres,
> > regardless of the fact that the start index is set to 2. So it should be
> > also translated to a Python list with only one item.
>
> You can't disregard the fact that the start index is set to 2.
> That's the whole point I'm trying to make.
>
> It should be translated into a python list whose item[n-1] equals the
> value whose item[n] in postgres for all n from 1 to array_upper() of
> the array.
>
> > However, if you really want a Null element as part of the list, you can do
> > it as follows:
> >
> > cursor.execute("select cast('{NULL,1}' as integer[])")
> > rows = cursor.fetchall()
> > print('%r' % rows[0][0])
> >
> > This should in fact output [None, 1].
>
> No I can't! The data already exists in postgres. I'm just selecting it.
>
> I can't magically change the selection sql to identify these arrays
> and insert nulls into them on the way out. Or at least I can't anymore.
> With pygresql-4 I would receive the string version and parse it into
> a correct python list. With pygresql-5 I no longer have that option.
>
> Even if you completely disagree with me, please accept that this
> is incredibly important to me. My database is filled with arrays
> and many are like these. If you don't add some way for me to
> restore the old behaviour or fix the new behaviour, I will not
> be able to upgrade to pygresql-5 ever.
>
> Please, either add what I consider to be correct parsing for the
> postgres's index notation, and provide some way to select that
> interpretation (although it really should be the default, I
> don't care as long as it's available somehow) or just provide an
> option to leave the postgres arrays in their string form so that
> I can continue to parse them myself.
>
> Please don't force me to stay on pygresql-4 forever.
>
> cheers,
> raf
>
> > -- Chris (back from vacation)
> > _______________________________________________
> > PyGreSQL mailing list
> > [email protected]
> > https://mail.vex.net/mailman/listinfo.cgi/pygresql
> _______________________________________________
> PyGreSQL mailing list
> [email protected]
> https://mail.vex.net/mailman/listinfo.cgi/pygresql
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql