2010-01-18 72 views
0

我使用的SQLAlchemy当Postgres的有以下异常:SQLAlchemy的和无法适应

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

ProgrammingError: (ProgrammingError) can't adapt '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'}

文字是出现在www.google.com.ar(底部)的一个...“Progmas de publicidad - Soluciones Empresariales - 谷歌Google - Google.com ©2010 - Privacidad”。内容是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'。”。 BUT我不明白为什么会发生这种情况,因为我正在使用该模型来进行查询,所以SQLALchemy(我认为)应该逃避事件。

在此先感谢

+0

粘贴代码导致错误,否则就没有办法去发现为什么在查询占位符不匹配参数。 – 2010-01-19 11:48:39

回答

0

我对ML日前回答了这个和这个问题很可能是你需要启用“UTF-8”客户端编码PostgreSQL数据库。

+0

数据库已经具有编码utf8 – tzulberti 2010-01-20 15:07:28

0

下面是一个测试用例,它以三种不同的方式发布您的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:[email protected]/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