既存のMySQLデータベースからSQLAlchemy宣言クラス定義をリバースエンジニアリングしますか?

StackOverflow https://stackoverflow.com/questions/1425412

  •  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コードを生成します。

他のヒント

リフレクションテーブルで宣言を使用できることに留意してください。したがって、起動時間がそれほど大きな問題ではない場合は、次の操作を実行できます。

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スキーマの内省的なマッピングを実行できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top