Skip to content

Instantly share code, notes, and snippets.

@shouhei
Last active September 26, 2019 08:19
Show Gist options
  • Save shouhei/784b65776258d091a187 to your computer and use it in GitHub Desktop.
Save shouhei/784b65776258d091a187 to your computer and use it in GitHub Desktop.
SQLAlchemy Python3 MySQL Geometroy
# 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