SQLalchemy で動作するように namedtuple を取得しようとしましたが、役に立ちませんでした.. Web 検索はあまり明るくなく、Python と SQLalchemy は初めてなので、風車を追いかけているかどうかはよくわかりません。 (基本的な考え方は、namedtuple があるということです。つまり、
Point=namedtuple('Point',['x','y'])
私が正しければ、基本的にクラス Point(tuple) を作成します。これは最初は問題なく動作し、次のようなオブジェクトを作成できます。
p=Point(3,4)
しかし、エンジンなどを作成して mapper を呼び出した後、このエラーが発生せずにこれ以上オブジェクトを作成することはできません:
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
f=Point(3,4)
TypeError: __init__() takes exactly 1 argument (3 given)
なぜそれが起こるのか?namedtuple を sqlalchemy で動作させる方法を知っている人はいますか? もちろん、独自の Point クラスを定義することもできますが、namedtuple を機能させることに夢中になっています。Python 2.7、SQLalchemy 0.6.6 (sqlite エンジン) を使用しています。
例:
私はこのようなことを試みています:
from sqlalchemy import *
from sqlalchemy.orm import *
from collections import namedtuple
Point=namedtuple('Point',['x','y'],verbose=True)
p=Point(3,4)
db=create_engine('sqlite:///pointtest.db')
metadata=MetaData()
pointxy=Table('pointxy',metadata,
Column('no',Integer,primary_key=True),
Column('x',Integer),
Column('y',Integer),
sqlite_autoincrement=True)
metadata.create_all(db)
m=mapper(Point, pointxy)
Session=sessionmaker(bind=db)
session=Session()
f=Point(3,4)
主なアイデアは、データベースに簡単に保存できる名前付きのコレクションが必要だということです。したがって、この:
class Bunch:
__init__ = lambda self, **kw: setattr(self, '__dict__', kw)
sqlalchemy では動作しません (と思います)。Bunch クラスを作成できますが、コレクションに格納する int の数を事前に知りません。データベースを作成する前に設定します。私が理にかなっていることを願っています..