问题
I am pretty new to python and sqlalchemy and would like to ask for an advice.
What would be the best way to force uppercase values in a SqlAlchemy field when the record is inserted/updated? Should I use events for that? Here I am using flask-sqlalchemy version, but I believe it is something similar to 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)
...
Thanks for the advice
回答1:
Validators can do this fairly easily:
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()
A similar approach can be taken with descriptors or hybrids, though it's not quite as easy to apply the same mutations to multiple columns at once. Hybrids do provide some additional benefits, in that using them in queries can delegate work to the DBMS instead of performing the work on the Python side (though for this particular case, doing the work on the Python side doesn't really cost you anything).
To be clear, the validator is applied at the model level; you must be constructing Item
classes to benefit from it (for example, using Item.__table__
to directly manipulate the table will bypass the model's validator).
回答2:
Have a look at events
YOu can easily add a listener for a save/update and just uppercase the string:
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)
回答3:
The best way is to use descriptors
In you case you can do:
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()
来源:https://stackoverflow.com/questions/34321976/best-way-to-force-values-to-uppercase-in-sqlalchemy-field