【问题标题】:Issue with transforming data on insert?插入时转换数据的问题?
【发布时间】:2013-06-21 17:50:38
【问题描述】:

所以我想知道是否有人可以帮助我。

我现在有一些课

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

有什么想法吗?

【问题讨论】:

    标签: python mysql sqlalchemy pylons flask-sqlalchemy


    【解决方案1】:

    有一个更新的功能可以实现这一点,称为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')
    

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 1970-01-01
      • 2021-02-02
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多