Insertar Ñ con Django en PostgreSQL

225 views
Skip to first unread message

Carlos Joel Delgado Pizarro

unread,
Sep 12, 2012, 4:13:52 PM9/12/12
to Argentina, Python, pytho...@googlegroups.com, djan...@googlegroups.com
Buenas tardes,
tengo un pequeño problema al importar datos a PostgreSQL, utilizando Django.
Tengo un archivo de texto con columnas de ancho fijo, que tiene los datos extraidos de ms-sql, una de las líneas tiene la palabra «CAÑETE» (que es la que me está dando problemas)

En el models.py tengo el campo

# -*- coding: utf-8 -*-
# codigo codigo codigo
class Unit(models.Model)
    # mas campos
    name = models.CharField(max_length=30, verbose_name='Nombre')
     # mas campos

Tengo un script import_data.py que lee los datos desde el archivo de texto

# -*- coding: utf-8 -*-
#codigo codigo

def import_unit_data():
    #codigo codigo
    unit = Unit()
    # mas campos

    unit.name = line[35:66].strip()
    # mas campos

    unit.save()

si hago un print unit.name sale:
>>>    CAÑETE
Osea que python/django reconoce la Ñ correcta.
Cuando llamo a ese módulo import_unit_data() desde Django, importa todos los datos sin problemas hasta que llega a esa línea sale un error.
Exception Type: DatabaseError
Exception Value:
value too long for type character varying(1)
Exception Location: /usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py in execute, line 52
Y este es el detalle
  1.             return self.cursor.execute(query, args)
    ...
Variable Value
query
'INSERT INTO "unit" ("code", "name", "abrev") VALUES (%s, %s, %s)'
self
<django.db.backends.postgresql_psycopg2.base.CursorWrapper object at 0x7f979c043890>
args
('9997',
 'CA\xc3\x91ETE',
 'CA\xc3\x91ETE')
e
DataError('value too long for type character varying(1)\n',)

la Ñ se convierte en \xc3\x91
Probé haciendo un insert into directamente en PostgreSQL y normal todo, no bota error.
si python reconoce la Ñ, Postgres también reconoce la Ñ.... ¿cómo puedo arreglar esto?
Probé esto http://darkchicles.wordpress.com/2009/04/15/cambiar-la-codificacin-de-caracteres-en-postgres/ pero tampoco me ayuda...

-- 
Saludos.

Carlos Joel Delgado Pizarro
Consultor TI-FLOSS
http://carlosjdp.info
http://gplus.to/carlosj2585
Linux User Registered #460895
Ubuntu User Registered #28720

Alexis Roda

unread,
Sep 12, 2012, 5:19:30 PM9/12/12
to djan...@googlegroups.com
Al 12/09/12 22:13, En/na Carlos Joel Delgado Pizarro ha escrit:

Yo utilizo django con postgres y no tengo ning�n problema con los
caracteres acentuados.

> Cuando llamo a ese m�dulo import_unit_data() desde Django, importa todos
> los datos sin problemas hasta que llega a esa l�nea sale un error.
> Exception Type: DatabaseError
> Exception Value:
>
> value too long for type character varying(1)

Es extra�o, el error hace referencia a un campo de longitud 1, name
tiene longitud 30.

Que sale si pones print type(unit.name) ?

Puestos a especular dir�a que el problema est� relacionado con el
charset del fichero desde el que importas los datos. Imagino que
obtienes un str codificado que deber�as convertir a unicode
(decodificarlo) antes de asignarlo a unit.name. Lo detectar�s si el
print type(unit.name) te saca <type 'str'>, si saca <type 'unicode'> el
problema es otro.




Saludos

Carlos Joel Delgado Pizarro

unread,
Sep 12, 2012, 6:13:22 PM9/12/12
to djan...@googlegroups.com, Alexis Roda
Ya lo correg�.... el problema era que la BD original es una MSSQL y
estaba en Latin1, y quer�a insertar a PostgreSQL en UTF-8.
con un .decode('utf8') lo arregl�, a parte que en la BD original la �
era una �, y tu ve que cambiar manualmente ese detalle y funcion� todo.


El 12/09/12 16:19, Alexis Roda escribi�:
Reply all
Reply to author
Forward
0 new messages