3

次のように定義されたテーブル「City」があります。

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 で python を使用して、このテーブルをマップします。

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

Python decimal パッケージを正しく理解していれば、これでうまくいくはずです:

from decimal import *

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

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

ただし、Decimal() を呼び出さない場合と同じエラーが発生します。

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

ここで何が間違っていますか?

4

1 に答える 1

3

私の推測では、 のインスタンスを送信しているためDecimallatまたはlongフィールドがインスタンスの文字列表現のようなものに変換されています。繰り返しますが、よくわかりません。pdbそれをデバッグするために使用できます。

とにかく、 SQLAlchemyDECIMALを介してフィールドを処理するより良い方法があります。MySQL小数処理を自分で処理する代わりに、sqlalchemy に任せることができます -

from sqlalchemy.ext.declarative import declarative_base 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))
    ...

Numericdecimal.Decimalフィールドはデフォルトでオブジェクトを返し、必要に応じて変換を適用します。

次に、次のように開始できます-

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

オーバーライド__init__()すると、 のように開始できますがCity(12.1111, 46.2222)、毎回値の数をカウントするのではなく、どのフィールドが何を取得しているかが一目でわかるように、列名を保持することをお勧めします。

コードをテストしていませんが、動作するはずです。試す。

于 2013-05-10T20:22:41.047 に答える