2013-05-10 84 views
2

我有一個表「城市」定義爲:分配蟒蛇小數對象到MySQL DECIMAL列

CREATE TABLE `City` (
    `id` int(11) NOT NULL, 
    `lat` decimal(9,6) default NULL, 
    `long` decimal(9,6) default NULL, 
    `lm_index` int(11) default NULL, 
    `num_business` int(11) default NULL, 
    `postal_code` varchar(16) default NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

我用SQLAlchemy的蟒蛇到這個表映射:如果我理解蟒蛇

Base = declarative_base(engine) 

class City(Base): 
    '''''' 
    __tablename__ = 'City' 
    __table_args__ = {'autoload':True} 
    def __init__(self, id, lat, long, lm_index, numbiz, postal): 
     self.id = id 
     self.lat = lat 
     self.long = long 
     self.lm_index = lm_index 
     self.num_business = numbiz 
     self.postal_code = postal 

十進制包正確,這應該工作:

from decimal import * 

getcontext().prec = 6 
lat = 12.11111111 
long = 46.2222222 

city = City(1, Decimal(str(lat)), Decimal(str(long)), 0, 0, 0) 

但是,我仍然會得到相同的錯誤,因爲我不打電話時D ecimal():

Warning: Data truncated for column 'lat' at row 1 

我在做什麼錯在這裏?

+0

只是好奇,爲什麼你重寫__init __的'()',而不是使用'sqlalchemy.types.DECIMAL'?這樣''sqlalchemy'處理所有事情。 – 2013-05-10 19:19:24

+0

我是SQLAlchemy的新手,我見過的所有例子都覆蓋__init__。我搜索了文檔,但無法弄清楚如何按照您的建議進行操作。如果你能給我一個提示,我會很感激。 – kslnet 2013-05-10 19:42:41

+0

您是否訪問過官方文檔?因爲這個頁面上的第一個例子顯示我在說什麼http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html – 2013-05-10 20:00:46

回答

2

我的猜測是,因爲你發送的Decimal的情況下,latlong領域正在轉向類似實例的字符串表示。再次,我不確定。您可以使用pdb進行調試。

無論如何,有更好的方法通過SQLAlchemy處理MySQL中的DECIMAL字段。而不是處理小數處理你自己,你可以只讓SQLAlchemy的照顧它 - 從sqlalchemy.ext.declarative進口

declarative_base 基地= declarative_base()

class City(Base): 
    __tablename__ = 'City' 
    __table_args__ = {'autoload':True} 

    id = Column(Integer, primary_key=True) 
    lat = Column(Numeric(precision=9, scale=6)) 
    long = Column(Numeric(precision=9, scale=6)) 
    ... 

Numeric場返回decimal.Decimal對象默認,根據需要應用轉換。

然後你就可以啓動它 -

city = City(lat=12.11111111, long=46.2222222, ...) 

如果覆蓋__init__()那麼你可以啓動它像City(12.1111, 46.2222),但我更喜歡保持列名,你就知道在哪個領域越來越一眼呀什麼而不是每次計算值的數量。

我沒有測試的代碼,但它應該工作。嘗試。

+1

我曾嘗試將列明確聲明爲Numeric(9,6)然後調用'city = City(id = 123,lat = 12.11111111,long = 46.22222222)' 相同的警告消息。 – kslnet 2013-05-11 02:37:14