ページ

2013年9月9日月曜日

mongoengineでのmongo db操作

今まではSQLite、MySQLを使ってデータベース接続部分を作っていましたが、DBのスキーマを変更する機会が多いためmongodbを使う事にしました。

ちなみにスキーマをしっかり決めればいいじゃんと思われる方もいるかと思いますが、リーンスタートアップで言うMVP(Most Valuable Product)をささっと作ってそこからユーザ要望を聞き出してどんどん改善をしていくというケースでは使えると思っています。

pythonからSQLiteやMySQLを使うときはSQLiteをORMとして使っていましたが、SQLAlchemyがmongodbに対応していないため、mongoengineを使う事にしました。

今回はmongoengineの使い方をちょっと書きます。

まずはインストールですが、pipを使ってmongoengineをインストールします。
# pip install mongoengine
プログラムは以下の様に書きます。
from mongoengine import Document, SequenceField, StringField,connect

class Person(Document):
    id = SequenceField(primary_key=True)
    name = StringField()

if __name__ == '__main__':
    connect('testdb01', host='localhost', port=27017)
    person = Person()
    person.name = 'Test Person'
    person.save()

説明:mongoengineをつかってORMを書く場合は、Documentを継承するクラスを作成します。そしてメンバにフィールド(RDBの列に相当するもの)を設定します。実際にDBを操作する処理はメインの中にあります。
まずconnectメソッドを使ってmongodbに接続します。コネクションはmongoengineのフレームワークによって処理されます。そのため、同じプロセスの中からDBにコネクションをする場合は、一度connectしてしまえば、その後はコネクション処理を考慮しなくても大丈夫です。
connectしたあとは他のORMと同じようにORMのクラスをインスタンス化して、メンバ変数に値を設定して、保存してという流れになります。

今回示したプログラムでデータを保存するとmongodbには以下のようなデータが保存されます。

{ "_id" : 1, "name" : "Test Person"}

今回はidにprimary_keyを設定しているため、上記データ形式になりますが、primary_keyを使用していない場合は、primary_keyとしてObjectIdが自動的に生成されて設定されます。

{ "_id" : ObjectId("522dda6752a8cf0ffcc35560"), "name" : "Test Person" }

mongoengineはコネクション処理もフレームワーク側で処理してくれるし、ORMの書き方もSQLAlchemyに似ているのでかなり使いやすくておすすめです。

2013年3月20日水曜日

SQLAlchemy+SQLiteでのAuto Increment

SQLAlchemy+SQLiteでAutoIncrementを使うときは、単にPrimaryKeyに値を入れずにcommitすれば良い。


from sqlalchemy import Column, Integer, String, Table, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///test.db', echo=True)
Base = declarative_base(bind=engine) 
 
class MyClass(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    type = Column(String(50))
    alt = Column("some_alt", Integer)

if __name__ == '__main__':

    Session = sessionmaker(bind=engine)
    session = Session()
    Base.metadata.create_all(engine)
 
    myclass = MyClass()
    myclass.type = "taiga"
    myclass.alt = 10
    
    session.add(myclass)
    session.commit()
上のプログラムではid(primary key)に何の値も入れずにcommitしているが、フレームワーク側でprimary keyをincrementしてくれる。