0

これは単純なはずだと思いますが、それが行われている例は1つも見つかりません。

例として、次の既存のテーブルがあります。

CREATE TABLE `source` (
  `source_id` tinyint(3) unsigned NOT NULL auto_increment,
  `name` varchar(40) default NULL,
  PRIMARY KEY  (`source_id`),
  UNIQUE KEY `source_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `event` (
  `source_id` tinyint(3) unsigned NOT NULL default '0',
  `info` varchar(255) NOT NULL default '',
  `item` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`source_id`,`info`,`item`),
  KEY `event_fkindex1` (`source_id`),
  CONSTRAINT `event_fk1` FOREIGN KEY (`source_id`) REFERENCES `source` (`source_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

sqlalchemy 0.6を使用して、イベントテーブルに多くの行を追加したいと思います。いくつかのsqlsoupの例を見てきましたが、dbオブジェクトを絶えず呼び出すことによってdbにアクセスする方法は本当に嫌いです。私はdbリフレクションのもののドキュメントに従い、これまでに得ました:

import sqlalchemy
from sqlalchemy import Table, Column, MetaData, create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql://user:pass@server/db', echo=True)
metadata = MetaData()
source = Table('source', metadata, autoload=True, autoload_with=engine)
Session = sessionmaker(bind=engine)
session = Session()
session.query(source).first()

これは本当に醜いオブジェクトを返します。DBに挿入するイベントオブジェクトを構築できるように、sqlalchemyORMのマッパー機能が本当に必要です。

私はsqlsoupのものを見ました:

from sqlalchemy.ext.sqlsoup import SqlSoup
db = SqlSoup(engine)
db.sources.all() #this kinda works out bet

しかし、この時点からオブジェクトを追加する方法がわかりませんでした。これが私が望むものであるかどうかさえわかりません。チュートリアルとdeclarative_baseのものに従うことができるようにしたいと思います。これは、テーブル構造全体をモデル化するためにクラスを書き直す必要なしに可能ですか?そうでない場合、誰かがこの例でこれをどのように行うかを教えてもらえますか?

誰かがマッパーのものを機能させるための正しい道を私に設定できますか?

4

1 に答える 1

2

__table__属性に割り当てることにより、declarative_baseで事前定義/自動ロードされたテーブルを使用できます。列はテーブルから取得されますが、使用するリレーションを宣言する必要があります。

class Source(Base):
    __table__ = source

class Event(Base):
    __table__ = event
    source = relation(Source)

ただし、大量の行を挿入する場合は、ORMを回避してexecutemanyを使用すると、パフォーマンスが大幅に向上します。次のように多くの実行を使用できます。

conn = engine.connect()
conn.execute(event.insert(),[
    {'source_id': 1, 'info': 'xyz', 'item': 'foo'},
    {'source_id': 1, 'info': 'xyz', 'item': 'bar'},
    ...
])
于 2010-02-18T18:56:21.950 に答える