在 sqlalchemy 字段中将值强制为大写的最佳方法
Best way to force values to uppercase in sqlalchemy field
我是 python 和 sqlalchemy 的新手,想寻求建议。
当记录为 inserted/updated 时,在 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)
...
感谢您的建议
看看events
您可以轻松地为 save/update 添加侦听器,只需将字符串大写即可:
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)
验证者可以很容易地做到这一点:
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, though it's not quite as easy to apply the same mutations to multiple columns at once. Hybrids 确实提供了一些额外的好处,因为在查询中使用它们可以将工作委托给 DBMS,而不是在 Python 端执行工作(尽管对于这种特殊情况,Python 方面的工作实际上不会花费您任何费用)。
需要说明的是,验证器应用于模型级别;您必须构建 Item
类 才能从中受益(例如,使用 Item.__table__
直接操作 table 将绕过模型的验证器)。
最好的方法是使用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()
我是 python 和 sqlalchemy 的新手,想寻求建议。
当记录为 inserted/updated 时,在 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)
...
感谢您的建议
看看events
您可以轻松地为 save/update 添加侦听器,只需将字符串大写即可:
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)
验证者可以很容易地做到这一点:
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, though it's not quite as easy to apply the same mutations to multiple columns at once. Hybrids 确实提供了一些额外的好处,因为在查询中使用它们可以将工作委托给 DBMS,而不是在 Python 端执行工作(尽管对于这种特殊情况,Python 方面的工作实际上不会花费您任何费用)。
需要说明的是,验证器应用于模型级别;您必须构建 Item
类 才能从中受益(例如,使用 Item.__table__
直接操作 table 将绕过模型的验证器)。
最好的方法是使用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()