3

Python ORM である Storm を考慮して、(mysql) データベースのスキーマを自動的に生成したいと考えています。ホームページには次のように記載されています

「Storm は既存のデータベース スキーマとうまく連携します。」( https://storm.canonical.com/FrontPage )、

したがって、モデルクラスを作成する必要がないことを望んでいました。ただし、「入門」チュートリアル ( https://storm.canonical.com/Tutorial ) では、以下のようなクラスをテーブルごとに手動で作成する必要があり、各フィールドを手動で指定する必要があることが示唆されています。

class Person(object):
  __storm_table__ = "person"
  id = Int(primary=True)
  name = Unicode()

あるいは、SQLAlchemy もリバース エンジニアリング機能をサポートしていないようですが、次のようなスキーマが必要です。

user = Table('user', metadata,
  Column('user_id', Integer, primary_key = True),
  Column('user_name', String(16), nullable = False),
  Column('email_address', String(60)),
  Column('password', String(20), nullable = False)
)

もちろん、これらのクラス/スキーマは理にかなっています。なぜなら、各テーブルは何らかの「関心のあるオブジェクト」を表す可能性が高く、あらゆる種類の機能でテーブルを拡張できるからです。ただし、それらを作成するのは面倒であり、データベースが既に存在する場合、その (最初の) コンテンツは簡単です。

リバース エンジニアリングを可能にする ORM の 1 つは次のとおりです。

http://docs.doctrine-project.org/en/2.0.x/reference/tools.html

Storm や SQLAlchemy、または python ORM や python database fancyfier用の同様のリバース エンジニアリング ツールはありますか?

4

1 に答える 1

3

Storm がこのプロセスをどのように管理しているかはわかりませんが、sqlalchemyを使用してデータベース内のテーブルを確実に反映できます。たとえば、以下は、現時点でアクセスできる SQL Server インスタンスを使用した基本的な例です。

データベース全体

>>> from sqlalchemy import create_engine, MetaData
>>> engine = create_engine('mssql+pyodbc://<username>:<password>@<host>/<database>')  # replace <username> with user name etc.
>>> meta = MetaData()
>>> meta.reflect(bind=engine)
>>> funds_table = meta.tables['funds']  # tables are stored in meta.tables dict
>>> funds_table  # now stores database schema object
Table(u'funds', MetaData(bind=None), Column(u'fund_token', INTEGER(), table=<funds>, primary_key=True, nullable=False), Column(u'award_year_token', INTEGER(), ForeignKey(u'award_year_defn.award_year_token'), table=<funds>, nullable=False), ... Column(u'fin_aid_disclosure_category', VARCHAR(length=3, collation=u'SQL_Latin1_General_CP1_CI_AS'), table=<funds>), Column(u'report_as_additional_unsub', BIT(), table=<funds>, server_default=DefaultClause(<sqlalchemy.sql.expression.TextClause object at 0x000000000545B6D8>, for_update=False)), schema=None)

一度に 1 つのテーブルのみを反映したい場合は、代わりに次のコードを使用できます。

一度に 1 つのテーブル(はるかに高速)

>>> from sqlalchemy import Table, create_engine, MetaData
>>> engine = create_engine('mssql+pyodbc://<username>:<password>@<host>/<database>')
>>> meta = MetaData()
>>> funds_table = Table('funds', meta, autoload=True, autoload_with=engine)  # indicate table name (here 'funds') with a string passed to Table as the first argument
>>> funds_table  # now stores database schema object
Table(u'funds', MetaData(bind=None), Column(u'fund_token', INTEGER(), table=<funds>, primary_key=True, nullable=False), Column(u'award_year_token', INTEGER(), ForeignKey(u'award_year_defn.award_year_token'), table=<funds>, nullable=False), ... Column(u'fin_aid_disclosure_category', VARCHAR(length=3, collation=u'SQL_Latin1_General_CP1_CI_AS'), table=<funds>), Column(u'report_as_additional_unsub', BIT(), table=<funds>, server_default=DefaultClause(<sqlalchemy.sql.expression.TextClause object at 0x000000000545B6D8>, for_update=False)), schema=None)

おそらく想像できると思いますが、関連するテーブルのデータを保存して、将来再びテーブルにすばやくアクセスできるようにすることができます。

于 2014-04-12T19:06:44.113 に答える