2013-05-10 116 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