SQLAlchemy и не может адаптироваться - PullRequest
0 голосов
/ 18 января 2010

У меня есть следующее исключение при использовании sqlalchemy на postgres:

raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)

ProgrammingError: (ProgrammingError) не могу изменить 'ОБНОВЛЕНИЕ doc_data SET содержание =% (содержание) с ГДЕ doc_data.serial_id = % (doc_data_serial_id) s '{' content ': Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com на английском языке \ xc2 \ xa92010 - Privacidad ',' doc_data_serial_id ': 3181L, 'title': 'Google'}

Этот текст отображается на сайте www.google.com.ar (внизу) ... "Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com на английском языке © 2010 - Privacidad ". Контент в юникоде ....

Модель:

class DocData(Data):  
    __tablename__ = 'doc_data'

    serial_id = Column(Integer, ForeignKey('data.serial_id', ondelete='cascade'),
                          primary_key=True)
    content = Column(UnicodeText)

А база данных:

CREATE TABLE doc_data  
(  
  serial_id integer NOT NULL,  
  "content" text  
)  
WITH (OIDS=FALSE);  

Есть идеи, почему произошла ошибка? При выполнении того же запроса на postgres я получаю предупреждение: «СОВЕТ: используйте синтаксис escape-строки для escape-строк, например, E '\ r \ n'.». Но я не понимаю, почему это происходит, потому что я использую модель для выполнения запроса, поэтому SQLALchemy (я думаю) должен избегать символов.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 20 января 2010

Ниже приведен тестовый пример, который выдает ваш оператор UPDATE тремя различными способами, третий из которых также воспроизводит нечетный дополнительный столбец «заголовок» в параметрах привязки. Все выполнено правильно. Пожалуйста, убедитесь, что вы используете недавнюю SQLAlchemy (версия 0.5.8 актуальна, пожалуйста, ничего до 0.5.5), а также последнюю версию psycopg2. Нам нужно увидеть полный тестовый пример, иллюстрирующий, как вы получаете ошибку.

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('postgresql://scott:tiger@localhost/test', echo=True)

Base = declarative_base()

class DocData(Base):  
    __tablename__ = 'doc_data'

    serial_id = Column(Integer, primary_key=True)
    content = Column(UnicodeText)

Base.metadata.create_all(engine)

data = 'Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com in English \xc2\xa92010 - Privacidad'.decode('utf-8')

sess = sessionmaker(engine)()

doc = DocData(serial_id=3181, content=None)
sess.add(doc)
sess.flush()

doc.content = data
sess.commit()

engine.execute(
    DocData.__table__.update().where(DocData.__table__.c.serial_id==3181),
    {'content':data,
    'title':'google'}
)

engine.execute("UPDATE doc_data SET content=%(content)s WHERE doc_data.serial_id = %(doc_data_serial_id)s", 
{'content': 'Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com in English \xc2\xa92010 - Privacidad', 'doc_data_serial_id': 3181L, 'title': 'Google'})

результат:

select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where n.nspname=current_schema() and lower(relname)=%(name)s
{'name': 'doc_data'}

CREATE TABLE doc_data (
serial_id SERIAL NOT NULL, 
content TEXT, 
PRIMARY KEY (serial_id)
)
{}
COMMIT
BEGIN
INSERT INTO doc_data (serial_id, content) VALUES (%(serial_id)s, %(content)s)
{'content': None, 'serial_id': 3181}
UPDATE doc_data SET content=%(content)s WHERE doc_data.serial_id = %(doc_data_serial_id)s
{'content': 'Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com in English \xc2\xa92010 - Privacidad', 'doc_data_serial_id': 3181}
COMMIT
UPDATE doc_data SET content=%(content)s WHERE doc_data.serial_id = %(serial_id_1)s
{'content': 'Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com in English \xc2\xa92010 - Privacidad', 'serial_id_1': 3181}
COMMIT
UPDATE doc_data SET content=%(content)s WHERE doc_data.serial_id = %(doc_data_serial_id)s
{'content': 'Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com in English \xc2\xa92010 - Privacidad', 'doc_data_serial_id': 3181L, 'title': 'Google'}
COMMIT
0 голосов
/ 20 января 2010

Я ответил на это на ML на днях, и проблема, вероятно, заключается в том, что вам нужно включить кодировку клиента "utf-8" для вашей базы данных postgresql.

...