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 回答