[Biopython-dev] BioSQL test code on Postgres

Cymon Cox cy at cymon.org
Tue Aug 31 09:11:08 UTC 2010


Hi Peter,

On 30 August 2010 19:21, Peter <biopython at maubp.freeserve.co.uk> wrote:

> On Mon, Aug 30, 2010 at 6:36 PM, Cymon Cox <cy at cymon.org> wrote:
> > Hi Folks,
> >
> > The current test code in test_BioSQL.py fails on PostgreSQL;
> >
> > ERROR: Check list, keys, length etc
> > ----------------------------------------------------------------------
> > Traceback (most recent call last):
> >  File "/home/cymon/git/biopython-github-master/Tests/test_BioSQL.py",
> line
> > 187, in test_get_db_items
> >    del db["non-existant-name"]
> >  File "/home/cymon/git/biopython-github-master/BioSQL/BioSeqDatabase.py",
> > line 519, in __delitem__
> >    if key not in self:
> >  File "/home/cymon/git/biopython-github-master/BioSQL/BioSeqDatabase.py",
> > line 539, in __contains__
> >    (self.dbid, value))[0])
> >  File "/home/cymon/git/biopython-github-master/BioSQL/BioSeqDatabase.py",
> > line 423, in execute_and_fetch_col0
> >    self.execute(sql, args or ())
> >  File "/home/cymon/git/biopython-github-master/BioSQL/BioSeqDatabase.py",
> > line 404, in execute
> >    self.dbutils.execute(self.cursor, sql, args)
> >  File "/home/cymon/git/biopython-github-master/BioSQL/DBUtils.py", line
> 33,
> > in execute
> >    cursor.execute(sql, args or ())
> > DataError: invalid input syntax for integer: "non-existant-name"
> > LINE 1: ...M bioentry WHERE biodatabase_id=1 AND
> bioentry_id=E'non-exis...
> >
> > Because when trying to delete a bioentry_id that is a string type, ie.
> > "non-existant-name" (line 188 on test_BioSQL.py),  postgres throws an
> error
> > rather than returning a long (0,1) as in sqlite (and presumably MySQL (I
> > havent tried it)).
>
> This (test_get_db_items) is once the unit tests added since Biopython 1.54,
> while I was working on making the BioSQL objects act more like
> dictionaries.
> I think the SQL statements for the __contains__ method (and others added
> recently) may need single quotes round the %s placeholders. Does that work?
>


Nope. The bioentry_id parameter is already being passed as a string -
psycopg automatically converts python objects into SQL literals (see
http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters
).

Here is the same error using the psql interface:

biosqldb=# select count(bioentry_id) from bioentry where biodatabase_id=1
and bioentry_id='non-existant';
ERROR:  invalid input syntax for integer: "non-existant"
LINE 1: ...m bioentry where biodatabase_id=1 and bioentry_id='non-exist...

biosqldb=# \d bioentry;
                                     Table "public.bioentry"
     Column     |          Type          |
Modifiers
----------------+------------------------+-------------------------------------------------------
 bioentry_id    | integer                | not null default
nextval('bioentry_pk_seq'::regclass)

Cheers, Cymon



More information about the Biopython-dev mailing list