在postgres上使用sqlalchemy时出现以下异常:
raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
ProgrammingError :( ProgrammingError) 无法适应'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(位于底部)......“Programas de publicidad - Soluciones Empresariales - Todo acerca de Google - Google.com in English ©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(我认为)应该逃避carahcters。
提前致谢
答案 0 :(得分:0)
我前几天在ML上回答了这个问题,问题可能是您需要为postgresql数据库启用“utf-8”客户端编码。
答案 1 :(得分:0)
下面是一个测试用例,它以三种不同的方式发出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