既存のMySQLデータベースからSQLAlchemy宣言クラス定義をリバースエンジニアリングしますか?
-
07-07-2019 - |
質問
約50のテーブルを含む既存のmysqlデータベースがあります。
宣言型のSqlAlchemyクラスを手動でコーディングするのではなく(ここに示すように)各テーブルには、Pythonクラスを生成するmysqlデータベースに対して実行できるツール/スクリプト/コマンドがありますデータベース内の各テーブルの宣言スタイルですか?
次のように、例として1つのテーブルだけを取得するには(理想的には50個すべてに対して生成されます):
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+
次のようなものを含むテキストファイルを生成できるツール/スクリプト/コマンドがあります:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Department(Base):
__tablename__ = 'departments'
dept_no = Column(String(5), primary_key=True)
dept_name = Column(String(50))
def __init__(self, dept_no, dept_name):
self.dept_no = dept_no
self.dept_name = dept_name
def __repr__(self):
return "<Department('%s','%s')>" % (self.dept_no, self.dept_name)
解決
sqlautocode を使用:
既存のデータベースからモデルを自動生成する柔軟なツールです。
これは、 SqlSoup へのわずかに異なるアプローチであり、明示的にせずにテーブルを使用できます。それらを定義します。一方、sqlalutocodeは実際のPythonコードを生成します。
他のヒント
現在(2015年)は、おそらく https://pypi.python.org/pypiを使用します。代わりに/ sqlacodegen !
リフレクションテーブルで宣言を使用できることに留意してください。したがって、起動時間がそれほど大きな問題ではない場合は、次の操作を実行できます。
engine = create_engine('mysql://...')
meta = MetaData()
meta.reflect(bind=engine)
for table in meta.tables.values():
print """
class %s(Base):
__table__ = Table(%r, Base.metadata, autoload=True)
""" % (table.name, table.name)
オートコード以外の方法がおそらくあります。
SqlSoup は、既存のSQLスキーマの内省的なマッピングを実行できます。
所属していません StackOverflow