nasıl bir SQLite veritabanı motoru ile bir sayısal sütun kullandığınızda sqlalchemy bana aşağıdaki uyarı vermek sqlalchemy & SQLite'ta


21

yılında ondalık işlemek gerekir.

SAWarning: Ağız sqlite + pysqlite hala SQLite kullanırken sqlalchemy içinde pkgPrice = Column(Numeric(12,2)) için en iyi şekilde anlamaya çalışıyorum doğal

değil destek Ondalık nesneleri yok.

Bu soru [1] How to convert Python decimal to SQLite numeric? SQLite almak ve ondalık dönmek zorunda sqlite3.register_adapter(D, adapt_decimal) kullanmanın bir yolunu gösterir ama mağaza Strings, ama henüz bunu yapmak için SQLAlchemy çekirdeğe kazmak nasıl bilmiyorum. Tip Dekoratörler doğru yaklaşım gibi gözüküyor ama ben onları daha fazla düşünmüyorum.

kimse SQLAlchemy modelinde Sayısal veya ondalık sayılar var ama SQLite'ta dizeleri olarak bunları depolayacak bir SQLAlchemy Tipi Dekoratör tarifi var mı? Para birimi değerleri için ondalık sayılar kullanılarak anlaşıldığından beri

16
from decimal import Decimal as D 
import sqlalchemy.types as types 

class SqliteNumeric(types.TypeDecorator): 
    impl = types.String 
    def load_dialect_impl(self, dialect): 
     return dialect.type_descriptor(types.VARCHAR(100)) 
    def process_bind_param(self, value, dialect): 
     return str(value) 
    def process_result_value(self, value, dialect): 
     return D(value) 

# can overwrite the imported type name 
# @note: the TypeDecorator does not guarantie the scale and precision. 
# you can do this with separate checks 
Numeric = SqliteNumeric 
class T(Base): 
    __tablename__ = 't' 
    id = Column(Integer, primary_key=True, nullable=False, unique=True) 
    value = Column(Numeric(12, 2), nullable=False) 
    #value = Column(SqliteNumeric(12, 2), nullable=False) 

    def __init__(self, value): 
     self.value = value 
+1

Umarım kodunuzda küçük bir değişiklik önerirsem sorun olmaz. :) sadece process_result_value bir değer dönen yerine ben yapmak önermek edersen şube: def process_result_value (self, değer, lehçesi): eğer value = "Yok":! dönüş D (değer) başka : return Yok 01 mar. 132013-03-01 15:50:33

+1

@van, Yeni SqliteNumeric sütunlarınızda sorgulamayı denediniz mi? Dizi karşılaştırması, sayısal karşılaştırmadan tamamen farklı olduğu için sonuç doğru değildir. Eğer session.query (T) .filter (T.value> 100) yaparsanız göreceksiniz. 02 eki. 162016-10-02 19:32:32

  0

Ayrıca, önceden belirtilen impl = types.String belirtmişseniz load_dialect_impl bölümünün gereksiz olduğunu düşünüyorum. 03 eki. 162016-10-03 03:44:35


15

, güvendesin şeyi önermek ve en düşük mezhep, ör para biriminin değerini depolamak istiyorum 1610 sent yerine 1610 dolar. Daha sonra bir Tamsayı sütun tipi kullanabilirsiniz.

Size bekliyorduk cevap olmayabilir ama sorununuzu çözer ve genellikle aklı başında tasarım kabul edilir.

  0

Uygulamam stoklar ve yatırım fonları ile de ilgileniyor, ör. 123,123456. 01 may. 122012-05-01 22:31:13

+2

Sayma para biriminiz gerçek olmak zorunda değildir, sadece stok, yatırım fonu veya tavuk kostümü gibi, işletmenin en küçük alt bölümlerine eşit olmak zorundadır. Örneğin. 1 gadagong örneğin gösterim amacıyla 6 basamaklı bir ondalık tipe dönüştürüldüğü 1231223456 gadagongs. Dışsal gösterim için Ondalık türünü kullanmak kötü bir fikir değildir, ancak para biriminin içsel gösterimi için tamsayı kullanmak aklı başındadır. 02 may. 122012-05-02 06:49:15