Unicode SQLAlchemy和Can';不适应

Unicode SQLAlchemy和Can';不适应,unicode,sqlalchemy,Unicode,Sqlalchemy,在postgres上使用sqlalchemy时,我有以下例外: raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect) 编程错误:(编程错误) 无法调整“更新文档\u数据集” 内容=%(内容)s,其中 doc\u data.serial\u id= %(doc_data_serial_id)s'{'content': “公共计划-解决方案” 商业酒店-Todo a

在postgres上使用sqlalchemy时,我有以下例外:

raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
编程错误:(编程错误) 无法调整“更新文档\u数据集” 内容=%(内容)s,其中 doc\u data.serial\u id= %(doc_data_serial_id)s'{'content': “公共计划-解决方案” 商业酒店-Todo acerca de Google -Google.com英文版\xc2\xa92010-Privacidad“,”文档数据\序列号“: 3181L,“标题”:“谷歌”}

该文本显示在www.google.com.ar(底部)。。。“Programas de publicidad-Soluciones Empresarials-Todo acerca de Google-Google.com英文版 ©2010-Privad”。内容是unicode

模型是:

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上执行相同的查询时,我得到一个警告:“提示:对转义使用转义字符串语法,例如,e'\r\n'。”。但我不明白为什么会发生这种情况,因为我正在使用模型进行查询,所以SQLALchemy(我认为)应该避开carahcters


提前感谢

我前几天在ML上回答了这个问题,问题可能是您需要为您的postgresql数据库启用“utf-8”客户端编码。

下面是一个测试用例,它以三种不同的方式发出UPDATE语句,其中第三种方式还复制了绑定参数中的奇数额外“title”列。全部正确完成。请确保您使用的是最新的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

粘贴导致错误的代码,否则无法发现查询中占位符与参数不匹配的原因。