在sqlalchemy字段中强制值为大写的最佳方法

时间:2015-12-16 20:58:04

标签: python sqlalchemy field uppercase

我是python和sqlalchemy的新手,想要求建议。

插入/更新记录时,在SqlAlchemy字段中强制大写值的最佳方法是什么?我应该使用事件吗?这里我使用的是flask-sqlalchemy版本,但我相信它与SQLAlchemy类似。

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Item(db.Model):
    # I need to ensure the code column converts values to uppercase automatically
    code = db.Column(db.String(30), primary_key=True)
    name = db.Column(db.String(250), nullable=False)
    ...

感谢您的建议

3 个答案:

答案 0 :(得分:8)

验证者可以相当容易地做到这一点:

from sqlalchemy.orm import validates

class Item(db.Model):
    # I need to ensure the code column converts values to uppercase automatically
    code = db.Column(db.String(30), primary_key=True)
    name = db.Column(db.String(250), nullable=False)

    @validates('code', 'name')
    def convert_upper(self, key, value):
        return value.upper()

可以使用descriptors or hybrids采用类似的方法,但同时将相同的突变应用于多个列并不容易。 Hybrids确实提供了一些额外的好处,因为在查询中使用它们可以将工作委托给DBMS,而不是在Python端执行工作(尽管对于这种特殊情况,在Python端进行工作并不是这样做的。真的让你付出了代价。)

答案 1 :(得分:1)

最好的方法是使用descriptors

在你的情况下,你可以这样做:

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Item(db.Model):
    # I need to ensure the code column converts values to uppercase automatically
    _code = db.Column("code", db.String(30), primary_key=True)
    _name = db.Column("name", db.String(250), nullable=False)

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name.upper()

    @property
    def code(self):
        return self._code

    @code.setter
    def name(self, code):
        self._code = code.upper()

答案 2 :(得分:0)

查看events

你可以很容易地为保存/更新添加一个监听器,只是大写字符串:

def uppercase_code(target, value, oldvalue, initiator):
    return value.upper()

# setup listener on Item.code attribute, instructing
# it to use the return value
listen(Item.code, 'set', uppercase_code, retval=True)