SQLAlchemyのModelクラスをMySQLから自動生成する
SQLAlchemyのMySQLモデルを書くのが面倒で、きっと何かツールがあるのでしょうが、探せなかったので作りました。
- JOINとかには対応してないので用途によっては生成後書き足す事も必要です。
- この例ではAmazon RDSのMySQLを使用しています。
- config.pyはそれぞれの環境にあわせて作成してください。
- 全ての型を網羅していません。自分が取り急ぎ必要な型だけサポートしています。
目次
テーブル情報の取得
まず、pymysqlでデータベースに接続して show tables で全テーブル情報の配列を取得します。
書き出し先のテキストファイルも用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
conn = pymysql.connect( host, user=user, passwd=password, db=db_name, charset='utf8', cursorclass=pymysql.cursors.DictCursor ) cur = conn.cursor() sql = 'show tables' cur.execute(sql) tables = cur.fetchall() write_file = open(db_name + '_models.txt', 'w') |
show tablesの結果
テーブル名がTables_in_[db_name]というカラムで出力されます
Tables_in_db_name |
---|
table_name_1 |
table_name_2 |
… |
カラム情報の取得
テーブル情報配列をループしてtable[‘Tables_in_’ + db_name]でテーブル名を取得します。
そして、show columns from table_name でテーブルの情報を取得します。
1 2 3 4 5 |
table_name = table['Tables_in_' + db_name] sql = 'show columns from ' + table_name cur.execute(sql) columns = cur.fetchall() |
show columns from ‘ + table_nameの結果
カラム名、型、Null許可か、プライマリキーか、デフォルト値といった情報が出力されます。
なので、この情報をもとにモデルクラスを書き出します。
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(10) | NO | PRI | ||
name | varchar(20) | YES | NULL |
型と長さとunsigned
Type列の出力値からSQLAlchemyの文法にもとづいて生成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
def get_type(type_str): sta = type_str.find('(') end = type_str.find(')') ts = type_str[0:3] length = -1 unsigned = '' ret_type = '' if sta > 0: length = type_str[sta+1:end] if type_str.find('unsigned') > -1: unsigned = 'unsigned=True' if type_str.find('decimal') > -1: ret_type = 'DECIMAL()' elif type_str.find('bigint') > -1: ret_type = 'BIGINT(' + unsigned + ')' elif type_str.find('varchar') > -1: ret_type = 'VARCHAR(' + str(length) + ')' elif type_str.find('datetime') > -1: ret_type = 'DATETIME()' elif type_str.find('char') > -1: ret_type = 'CHAR(' + str(length) + ')' elif type_str.find('text') > -1: ret_type = 'TEXT()' elif type_str.find('tinyint') > -1: ret_type = 'TINYINT(' + unsigned + ')' elif type_str.find('time') > -1: ret_type = 'TIME()' elif type_str.find('int') > -1: ret_type = 'INTEGER(' + unsigned + ')' return ret_type |
モデルクラスの書き出し
テーブル名を書き出した後、カラムを1行づつインデントを付けて書き出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
write_file.write('\n\n') write_file.write('class ' + table_name.upper() + '(Base):\n') write_file.write(" __tablename__ = '" + table_name.upper() + "'\n\n") for column in columns: field_str = column['Field'] type_str = column['Type'] null_str = column['Null'] key_str = column['Key'] pri_str = '' null_able = '' if key_str == 'PRI': pri_str = ' primary_key=True, ' if null_str == 'NO': null_able = 'nullable=False)' else: null_able = 'nullable=True)' line_str = ' ' line_str += field_str + ' = Column(' line_str += get_type(type_str) + ', ' line_str += pri_str line_str += null_able write_file.write(line_str + '\n') |
出来た!
1 2 3 4 5 6 |
class TABLE_NAME(Base): __tablename__ = 'TABLE_NAME' ID = Column(INTEGER(unsigned=True), primary_key=True, nullable=False) NAME = Column(VARCHAR(20), nullable=True) |
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
feedlyでタグ付けした記事を自動でメール配信する
feedlyを使っていて、良記事や知っておいて欲しい記事とかを部門とかチームとか …
-
pyenv update で「pyenv: no such command `update’ 」
環境 macOS Sierra 10.12.4 pyenvのアップデート pye …
-
Python SQLAlchemy MySQLでcase文を使う
PythohのORMライブラリSQLAlchemyでMySQLのテーブルSele …
-
Redmine REST APIを操作するpython_redmineを試してみた
Redmine のGUIの登録が面倒なのでコマンドで登録、更新、時間の記録が出来 …
-
個人のGoogleカレンダーの予定をPythonで取得する
Google Calendar Twilio ReminderのGoogleカレ …
-
docomo Developer supportの 雑談対話APIから自然対話APIへ移行しました
LINEやSlackのbotで重宝していた、雑談対話APIが終了する、とのことで …
-
「神戸Pythonの会 #2 meetup」に行ってきました
「神戸Pythonの会 #2 meetup」に行ってきました。 所感など Ato …
-
Linux Mint 17 MATE 64bit にIPython Notebookをインストールする
今日行く勉強会でIPython Notebookの環境が必要なため、手持ちのLi …
-
SQLAlchemy Session.executeでinsertしてAUTO INCREMENTでセットされたプライマリキーを取得したい
PythohのORMライブラリSQLAlchemyでMySQLにインサートしたレ …
-
Pepper 開発 ワークショップ初級~中級~番外編に1日で一気に参加した
Pepperの開発方法が知りたかったので、Pepperアトリエ秋葉原 with …
- PREV
- SQLAlchemyでjoinする
- NEXT
- re:dashで必須でない検索条件を作りたい