Re: Oracle database TextField limitations and Django admin interface queries

2013-04-19 Thread Lauri Savolainen


On Saturday, April 13, 2013 7:54:43 PM UTC+3, Ian wrote:
>
> On Saturday, April 13, 2013 10:40:10 AM UTC-6, Ian wrote:
>>
>> On Friday, April 12, 2013 7:43:32 AM UTC-6, Lauri Savolainen wrote:
>>>
>>> Thank you for the reply,
>>>
>>> The field is defined in the Django model as:
>>> location_description = models.TextField(_('additional route 
>>> information'), blank=True)
>>>
>>> Data length for the corresponding column in the database seems to be 
>>> 4000 and the type is NCLOB. The database is created by Django's syncdb and 
>>> is not a legacy one.
>>>
>>> This is the raw SQL query the Django admin interface produces:
>>>
>>> SELECT DISTINCT "app_route"."id", 
>>> "app_route"."route_no", 
>>> "app_route"."owner_no", 
>>> "app_route"."municipality_code", 
>>> "app_route"."location_description", 
>>> "app_route"."latitude", 
>>> "app_route"."longitude" 
>>> FROM   "app_route" 
>>>inner join "app_observationevent" 
>>>ON ( "app_route"."id" = 
>>> "app_observationevent"."route_id" ) 
>>> WHERE  "app_observationevent"."observation_date" >= :arg0 
>>> ORDER  BY "app_route"."id" DESC 
>>>
>>> Executing it via the Django management shell django.db.connection 
>>> produces the same error (ORA-00932: inconsistent datatypes: expected - got 
>>> NCLOB) but when I remove the "app_route"."location_description" field 
>>> from the SELECT projection the query executes successfully.
>>>
>>>
>> Yes, this is caused by the use of a SELECT DISTINCT over a LOB column, 
>> which Oracle does not allow.  The DISTINCT was added to admin queries over 
>> joined fields as a result of ticket #15819.  As for workarounds -- I'm 
>> afraid I don't have any suggestions for you.
>>
>
> Actually, one suggestion: you could try removing the field from the 
> list_display option on the ModelAdmin.  I think you would also need to 
> override the get_queryset method on the ModelAdmin to .defer() the field, 
> as it doesn't look like the admin would do that automatically.
>

Hello,

Neither approach seemed to work so I ended up changing the field to a 
fixed-length type in the model and resyncing my tables which seems to work. 
Anyways, thank you for the suggestions.

- Lauri Savolainen

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.




Re: Oracle database TextField limitations and Django admin interface queries

2013-04-13 Thread Ian
On Saturday, April 13, 2013 10:40:10 AM UTC-6, Ian wrote:
>
> On Friday, April 12, 2013 7:43:32 AM UTC-6, Lauri Savolainen wrote:
>>
>> Thank you for the reply,
>>
>> The field is defined in the Django model as:
>> location_description = models.TextField(_('additional route 
>> information'), blank=True)
>>
>> Data length for the corresponding column in the database seems to be 4000 
>> and the type is NCLOB. The database is created by Django's syncdb and is 
>> not a legacy one.
>>
>> This is the raw SQL query the Django admin interface produces:
>>
>> SELECT DISTINCT "app_route"."id", 
>> "app_route"."route_no", 
>> "app_route"."owner_no", 
>> "app_route"."municipality_code", 
>> "app_route"."location_description", 
>> "app_route"."latitude", 
>> "app_route"."longitude" 
>> FROM   "app_route" 
>>inner join "app_observationevent" 
>>ON ( "app_route"."id" = 
>> "app_observationevent"."route_id" ) 
>> WHERE  "app_observationevent"."observation_date" >= :arg0 
>> ORDER  BY "app_route"."id" DESC 
>>
>> Executing it via the Django management shell django.db.connection 
>> produces the same error (ORA-00932: inconsistent datatypes: expected - got 
>> NCLOB) but when I remove the "app_route"."location_description" field 
>> from the SELECT projection the query executes successfully.
>>
>>
> Yes, this is caused by the use of a SELECT DISTINCT over a LOB column, 
> which Oracle does not allow.  The DISTINCT was added to admin queries over 
> joined fields as a result of ticket #15819.  As for workarounds -- I'm 
> afraid I don't have any suggestions for you.
>

Actually, one suggestion: you could try removing the field from the 
list_display option on the ModelAdmin.  I think you would also need to 
override the get_queryset method on the ModelAdmin to .defer() the field, 
as it doesn't look like the admin would do that automatically.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.




Re: Oracle database TextField limitations and Django admin interface queries

2013-04-13 Thread Ian
On Friday, April 12, 2013 7:43:32 AM UTC-6, Lauri Savolainen wrote:
>
> Thank you for the reply,
>
> The field is defined in the Django model as:
> location_description = models.TextField(_('additional route information'), 
> blank=True)
>
> Data length for the corresponding column in the database seems to be 4000 
> and the type is NCLOB. The database is created by Django's syncdb and is 
> not a legacy one.
>
> This is the raw SQL query the Django admin interface produces:
>
> SELECT DISTINCT "app_route"."id", 
> "app_route"."route_no", 
> "app_route"."owner_no", 
> "app_route"."municipality_code", 
> "app_route"."location_description", 
> "app_route"."latitude", 
> "app_route"."longitude" 
> FROM   "app_route" 
>inner join "app_observationevent" 
>ON ( "app_route"."id" = 
> "app_observationevent"."route_id" ) 
> WHERE  "app_observationevent"."observation_date" >= :arg0 
> ORDER  BY "app_route"."id" DESC 
>
> Executing it via the Django management shell django.db.connection produces 
> the same error (ORA-00932: inconsistent datatypes: expected - got NCLOB) 
> but when I remove the "app_route"."location_description" field from the 
> SELECT projection the query executes successfully.
>
>
Yes, this is caused by the use of a SELECT DISTINCT over a LOB column, 
which Oracle does not allow.  The DISTINCT was added to admin queries over 
joined fields as a result of ticket #15819.  As for workarounds -- I'm 
afraid I don't have any suggestions for you.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.




Re: Oracle database TextField limitations and Django admin interface queries

2013-04-12 Thread Lauri Savolainen
Thank you for the reply,

The field is defined in the Django model as:
location_description = models.TextField(_('additional route information'), 
blank=True)

Data length for the corresponding column in the database seems to be 4000 
and the type is NCLOB. The database is created by Django's syncdb and is 
not a legacy one.

This is the raw SQL query the Django admin interface produces:

SELECT DISTINCT "app_route"."id", 
"app_route"."route_no", 
"app_route"."owner_no", 
"app_route"."municipality_code", 
"app_route"."location_description", 
"app_route"."latitude", 
"app_route"."longitude" 
FROM   "app_route" 
   inner join "app_observationevent" 
   ON ( "app_route"."id" = 
"app_observationevent"."route_id" ) 
WHERE  "app_observationevent"."observation_date" >= :arg0 
ORDER  BY "app_route"."id" DESC 

Executing it via the Django management shell django.db.connection produces 
the same error (ORA-00932: inconsistent datatypes: expected - got NCLOB) 
but when I remove the "app_route"."location_description" field from the 
SELECT projection the query executes successfully.



On Wednesday, April 10, 2013 4:09:43 PM UTC+3, Jani Tiainen wrote:
>
> 10.4.2013 14:45, Lauri Savolainen kirjoitti: 
> > A little background: my application is used to manage observational data 
> > which is collected from designated routes annually. Each route object 
> > has a set of observation events which in turn have a date field. The 
> > data is managed by using a (terrible) customized Django admin interface. 
> > 
> > In the admin interface list view it's possible to search routes using a 
> > custom search box which just injects parameters like ?route_no=1234 and 
> > so forth into the url resulting in a filtered list view. For the most 
> > part this works but when I want to search for routes that, for example, 
> > have observation events past certain date with a query like 
> > ?observationevent__observation_date__gte=2010-01-01 (supposed to show 
> > all routes that have been observed this decade) it raises an 
> > DatabaseError: ORA-00932: inconsistent datatypes: expected - got 
> > NCLOB-exception while using an Oracle database in production. The query 
> > seems to work when using a development SQLite database or doing a query 
> > like 
> > 
> Route.objects.filter(observationevent__observation_date__gte='2012-01-01') 
> > directly in the management console even when using the Oracle production 
> > database. 
> > 
> > According to the general notes on databases the Oracle backend has 
> > limitations with TextField-related queries 
> > (
> https://docs.djangoproject.com/en/dev/ref/databases/#textfield-limitations) 
>
> > and this seems to be causing this as far as I can tell. As the queries 
> > are created by Django admin I have no idea how I should proceed from 
> > here. Is there some kind of easy way to prevent this from happening on 
> > Oracle or should I implement some kind of manual search function? 
> > 
> > I am currently using the following versions: 
> > Django==1.4.5 
> > cx-Oracle==5.1.2 
> > gunicorn==0.17.2 
> > virtualenv==1.5.1 
> > 
>
> Welcome to among us very few and brave to use Oracle... ;) 
>
> What comes to your problem few details are missing but: 
>
> Length of the field in model definition and what column type is in the 
> database. Also it would be helpful to know are you using legacy database? 
>
> Actual error is slightly problematic since it doesn't directly tell what 
> is wrong. It's related types of bind variables and any of them might be 
> incorrect for some reason. 
>
> -- 
> Jani Tiainen 
>
> - Well planned is half done and a half done has been sufficient before... 
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.




Re: Oracle database TextField limitations and Django admin interface queries

2013-04-10 Thread Jani Tiainen

10.4.2013 14:45, Lauri Savolainen kirjoitti:

A little background: my application is used to manage observational data
which is collected from designated routes annually. Each route object
has a set of observation events which in turn have a date field. The
data is managed by using a (terrible) customized Django admin interface.

In the admin interface list view it's possible to search routes using a
custom search box which just injects parameters like ?route_no=1234 and
so forth into the url resulting in a filtered list view. For the most
part this works but when I want to search for routes that, for example,
have observation events past certain date with a query like
?observationevent__observation_date__gte=2010-01-01 (supposed to show
all routes that have been observed this decade) it raises an
DatabaseError: ORA-00932: inconsistent datatypes: expected - got
NCLOB-exception while using an Oracle database in production. The query
seems to work when using a development SQLite database or doing a query
like
Route.objects.filter(observationevent__observation_date__gte='2012-01-01')
directly in the management console even when using the Oracle production
database.

According to the general notes on databases the Oracle backend has
limitations with TextField-related queries
(https://docs.djangoproject.com/en/dev/ref/databases/#textfield-limitations)
and this seems to be causing this as far as I can tell. As the queries
are created by Django admin I have no idea how I should proceed from
here. Is there some kind of easy way to prevent this from happening on
Oracle or should I implement some kind of manual search function?

I am currently using the following versions:
Django==1.4.5
cx-Oracle==5.1.2
gunicorn==0.17.2
virtualenv==1.5.1



Welcome to among us very few and brave to use Oracle... ;)

What comes to your problem few details are missing but:

Length of the field in model definition and what column type is in the 
database. Also it would be helpful to know are you using legacy database?


Actual error is slightly problematic since it doesn't directly tell what 
is wrong. It's related types of bind variables and any of them might be 
incorrect for some reason.


--
Jani Tiainen

- Well planned is half done and a half done has been sufficient before...

--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.