Error: (1241, 'Operand should contain 1 column(s)')

179 views
Skip to first unread message

Rodrigo Culagovski

unread,
Jan 6, 2008, 8:24:19 PM1/6/08
to Django users
I am getting the following error:

OperationalError at /lista/
(1241, 'Operand should contain 1 column(s)')
Request Method: POST
Request URL: http://127.0.0.1:8000/lista/
Exception Type: OperationalError
Exception Value: (1241, 'Operand should contain 1 column(s)')
Exception Location: C:\Python24\Lib\site-packages\MySQLdb
\connections.py in defaulterrorhandler, line 35

Looking through the traceback, the error seems to happen in line 18
here:

C:\Python24\lib\site-packages\django\db\backends\util.py in execute

12. self.cursor = cursor
13. self.db = db # Instance of a BaseDatabaseWrapper subclass
14.
15. def execute(self, sql, params=()):
16. start = time()
17. try:

18. return self.cursor.execute(sql, params) ...

19. finally:
20. stop = time()
21. sql = self.db.ops.last_executed_query(self.cursor, sql, params)
22. self.db.queries.append({
23. 'sql': sql,
24. 'time': "%.3f" % (stop - start),

with:

sql =

u"SELECT DISTINCT
`revistas_articulo`.`id`,`revistas_articulo`.`visible`,`revistas_articulo`.`revista_id`,`revistas_articulo`.`pais`,`revistas_articulo`.`ciudad`,`revistas_articulo`.`titulo`,`revistas_articulo`.`volumen`,`revistas_articulo`.`numero`,`revistas_articulo`.`mes`,`revistas_articulo`.`ano`,`revistas_articulo`.`paginas`,`revistas_articulo`.`categoria`,`revistas_articulo`.`contenido`,`revistas_articulo`.`notas`,`revistas_articulo`.`idioma`,`revistas_articulo`.`descripcion`,`revistas_articulo`.`foto`,`revistas_articulo`.`ilustracion`,`revistas_articulo`.`link`,`revistas_articulo`.`fecha_creacion`,`revistas_articulo`.`fecha_modificacion`,`revistas_articulo`.`imagen`
FROM `revistas_articulo` LEFT OUTER JOIN `revistas_articulo_autores`
AS `m2m_revistas_articulo__autores` ON `revistas_articulo`.`id` =
`m2m_revistas_articulo__autores`.`articulo_id` INNER JOIN
`revistas_autor` AS `revistas_articulo__autores` ON
`m2m_revistas_articulo__autores`.`autor_id` =
`revistas_articulo__autores`.`id` INNER JOIN `revistas_revista` AS
`revistas_articulo__revista` ON `revistas_articulo`.`revista_id` =
`revistas_articulo__revista`.`id` WHERE ((`revistas_articulo`.`titulo`
LIKE %del% OR `revistas_articulo__autores`.`nombre` LIKE %del% OR
`revistas_articulo__autores`.`apellido` LIKE %del% OR
`revistas_articulo__revista`.`nombre` LIKE %del%) AND
`revistas_articulo`.`pais` = [u'Bolivia', u'Chile', u'Colombia',
u'Costa Rica', u'Cuba', u'Ecuador', u'El Salvador', u'Espa\\xf1a',
u'Guatemala', u'Honduras', u'M\\xe9xico', u'Nicaragua', u'Panam\\xe1']
AND `revistas_articulo`.`revista_id` = [u'Arquitectura',
u'Arquitectura y construccion', u'ARQUITECTURA- Colegio Nacional de
Arquitectos CUBA'] AND `revistas_articulo`.`categoria` = [u'Articulo -
noticia', u'Catalogo de materiales', u'Critica', u'Nota biografica',
u'Nota necrologica', u'Noticia', u'Reportaje fotografico', u'Resena
bibliografica', u'Resena de obra'])"

and

params = [u'%del%', u'%del%', u'%del%', u'%del%', [u'Bolivia',
u'Chile', u'Colombia', u'Costa Rica', u'Cuba', u'Ecuador', u'El
Salvador', u'Espa\xf1a', u'Guatemala', u'Honduras', u'M\xe9xico',
u'Nicaragua', u'Panam\xe1'], [u'Arquitectura', u'Arquitectura y
construccion', u'ARQUITECTURA- Colegio Nacional de Arquitectos CUBA'],
[u'Articulo - noticia', u'Catalogo de materiales', u'Critica', u'Nota
biografica', u'Nota necrologica', u'Noticia', u'Reportaje
fotografico', u'Resena bibliografica', u'Resena de obra']]

The error is triggered by the second-to-last 'if results:" line in my
views.py:

from django.db.models import Q
from django.shortcuts import render_to_response
from models import Articulo, Revista, choice_categoria
from forms import ListForm

def lista(request):
if request.method == 'POST':
form = ListForm(request.POST)
if form.is_valid():
data = form.cleaned_data
query = data['query']
ano_min = data['ano_min']
ano_max = data['ano_max']
pais = data['pais']
revista = data['revista']
categoria = data['categoria']
orderby = data['orderby']

results = Articulo.objects.all()
if query:
qset = (
Q(titulo__icontains=query) |
Q(autores__nombre__icontains=query) |
Q(autores__apellido__icontains=query) |
Q(revista__nombre__icontains=query)
)
results = results.filter(qset).distinct()
if ano_min:
results = results.filter(ano__gte=ano_min)
if ano_max:
results = results.filter(ano__lte=ano_max)
if pais:
results = results.filter(pais=pais)
if revista:
results = results.filter(revista=revista)
if categoria:
results = results.filter(categoria=categoria)
#if orderby:
#results = results.order_by(orderby)
#count = results.count()
if results:
success=True

(the commented out lines where also generating similar errors).

Thanks,

Rodrigo

Malcolm Tredinnick

unread,
Jan 7, 2008, 7:23:34 PM1/7/08
to django...@googlegroups.com

So you can see here that the problem is you're passing a list where the
SQL is expecting a value. Thus, checking your code for places where you
are using a list and exact ("=") matching, rather than "__in", will show
the problem.

[...]


> if categoria:
> results = results.filter(categoria=categoria)

Since, apparently, categoria is a list at this point, you should be
doing

results = results.filter(categoria__in=categoria)

The version you have written tries to do exact comparison, which only
makes sense if the right-hand side is a single value.

Regards,
Malcolm

--
Atheism is a non-prophet organization.
http://www.pointy-stick.com/blog/

Rodrigo Culagovski

unread,
Jan 7, 2008, 7:50:34 PM1/7/08
to Django users
Malcolm,

you're right, of course. That did the trick!

Thanks,

Rodrigo

On Jan 7, 9:23 pm, Malcolm Tredinnick <malc...@pointy-stick.com>
wrote:
Reply all
Reply to author
Forward
0 new messages