Last active
September 26, 2019 08:19
-
-
Save shouhei/784b65776258d091a187 to your computer and use it in GitHub Desktop.
SQLAlchemy Python3 MySQL Geometroy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Geometory型の設定 | |
| from sqlalchemy import func | |
| from sqlalchemy.types import UserDefinedType | |
| class Geometory(UserDefinedType): | |
| def get_col_spec(self): | |
| # カラムの型 | |
| return "GEOMETRY" | |
| def bind_expression(self, bindvalue): | |
| # データをセットした時の挙動の設定 | |
| # ここではGeomFromTextで値をラップする | |
| # POINT(lng lat) | |
| # LINESTRING(lng lat,lng lat) | |
| # POLYGON(lng lat,lng lat, ...) | |
| # 以上の3つの形式ならばbindvalueに使えそう | |
| return func.GeomFromText(bindvalue, type_=self) | |
| def column_expression(self, col): | |
| # データを取得した際の設定 | |
| # ここでは所得する際にASTEXTでラップする | |
| return func.ASTEXT(col, type_=self) | |
| # サンプル用のテーブルの作成 | |
| from sqlalchemy import create_engine | |
| from sqlalchemy import Table, Column, Integer, String, MetaData | |
| engine = create_engine('mysql+pymysql://root@localhost/verification',echo=True) | |
| metadata = MetaData() | |
| geo_table = Table("geo", metadata, | |
| Column('id', Integer, primary_key=True), | |
| # 以下のGeometoryがユーザー定義の型 | |
| Column('geometory', Geometory, nullable=False) | |
| ); | |
| metadata.create_all(engine) | |
| # 作成したテーブルをマッピングするクラス | |
| class Geo(object): | |
| def __init__(self,geometory): | |
| self.geometory = geometory | |
| # マッピング | |
| from sqlalchemy.orm import mapper | |
| mapper(Geo,geo_table) | |
| # sessionの作成 | |
| from sqlalchemy.orm import sessionmaker | |
| Session = sessionmaker(engine) | |
| if "__main__" == __name__: | |
| session = Session() | |
| geo_data = Geo("POINT(137.10 35.20)") | |
| session.add(geo_data) | |
| session.commit() | |
| data = session.query(Geo, func.X(Geo.geometory), func.Y(Geo.geometory)) | |
| print(data) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment