2010-01-18 69 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