0

だから誰かが私を助けることができるかどうか疑問に思っていました。

私は現在いくつかのクラスを持っています

class Sha1(ColumnClause):
    pass

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

そして、SQLAlchemy orm を使用して列を挿入すると、属性を Sha1(value) として渡して、その属性を実行させることができます。ただし、テスト目的で、モデルを次のようなデータベースにロードします

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))

何か案は?

4

1 に答える 1

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')
于 2013-06-21T19:32:17.323 に答える