2015-12-16 61 views
2

我對python和sqlalchemy非常陌生,並且想徵詢一個建議。在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) 
    ... 

謝謝你的建議

+0

你是說,你有用戶輸入應該被強制大寫? – MaxNoe

+0

是的,但是我想要自定義類型並使用它。我挖了一下,發現了一個TypeDecorator,它幾乎與除了僅在db.session.commit()上轉換值的異常一起工作。請看我的答案。謝謝 – Darius

回答

4

驗證器這樣做很容易:

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方面執行工作並不會真正花費任何東西) 。

+0

當應用此功能時,我會考慮拋出警告。用戶現在應該知道他應該輸入大寫字符串。這也最大限度地減少了用戶可以得到的驚喜。 – MaxNoe

+0

@MaxNoe:取決於你認爲這是什麼目的。無縫轉換爲大寫字母作爲設計功能以保存用戶的「Shift」/「Caps Lock」鍵,但某些磨損並非不合理。 – ShadowRanger

+0

@MaxNoe:你的建議編輯在任何情況下都是錯誤的(如果字符串中沒有裝入字符,'str.isupper'將返回'False',所以如果你通過'123',它會發出警告,即使沒有轉化是需要的)。雖然這是使用驗證功能,但驗證也可用於無縫轉換;實際使用的便利功能是一件好事;警告如果他們習慣了很愚蠢。 – ShadowRanger

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

謝謝。你能看看我的答案嗎? – Darius

相關問題