2013-06-21 46 views
0

所以我想知道是否有人可以幫助我。轉換插入數據的問題?

我現在有一些類

class Sha1(ColumnClause): 
    pass 

@compiles(Sha1) 
def compile_sha1(element, compiler, **kw): 
    return 'PASSWORD("{}")'.format(element.name) 

當我使用SQLAlchemy的ORM插入一個專欄中,我可以通過屬性爲SHA1(值),並讓它做它的事。但是出於測試目的,我們我們的模型加載到數據庫中類似

insert = model.__table__.insert(values) 
session.execute(insert) 

有沒有一種方法,在SQLAlchemy中,覆蓋產生這樣一個特定的模式的SQL的方式,它會生成的輸出改變從

insert into model (uuid, password) values (:uuid, :password) 

用我的SHA1類像

insert into model (uuid, password) values (:uuid, PASSWORD(:password)) 

任何想法?

回答

0

有一個更新的功能,它允許這稱爲bind_expression()。如果我理解正確的,你可能想改變你的Sha1接受任意元素,你不再需要調用Sha1明確,在這種情況下,參數將始終是一個BindParam

from sqlalchemy import * 
from sqlalchemy.sql.expression import ColumnElement 
from sqlalchemy.ext.compiler import compiles 

class Sha1(ColumnElement): 
    def __init__(self, arg): 
     self.arg = arg 

@compiles(Sha1) 
def compile_sha1(element, compiler, **kw): 
    return 'PASSWORD(%s)' % compiler.process(element.arg, **kw) 


class Sha1Type(TypeDecorator): 
    impl = String 

    def bind_expression(self, bindvalue): 
     return Sha1(bindvalue) 

m = MetaData() 
t = Table('mytable', m, 

     Column('id', Integer, primary_key=True), 
     Column('password', Sha1Type) 
    ) 


print t.insert() 
print t.insert().values(password='some password')