Demitri, any plans (or previous attempts) to integrate this into SQLAlchemy proper?
On Tuesday, September 8, 2015 at 1:00:22 AM UTC-4, Demitri Muna wrote: > > Hi Michael, > > > On Monday, September 7, 2015 at 5:40:02 PM UTC-4, Michael Bayer wrote: >> >> SQLAlchemy doesn't do much else with types at the most basic level other >> than pass the data through to the DBAPI, in this case hopefully psycopg2. >> Feel free to set the column type to NullType and just pass through strings, >> assuming that's what psycopg2 does here by default, or if you'd like to >> define your own type that translates some Python value to what psycopg2 >> expects here, there is UserDefinedType as well as TypeDecorator: >> http://docs.sqlalchemy.org/en/rel_1_0/core/custom_types.html#types-custom >> > > That's perfect, thanks. I decided to try a TypeDecorator, and it's working > for me. For anyone else who comes across this, I did this: > > class Field(Base): > __tablename__ = 'field' > __table_args__ = {'autoload' : True} > polygon_ = Column('polygon', PGPolygon) > > The column name in the database is "polygon"; I couldn't figure out how to > override it after autoload, so I created a new column property mapped to > the same column. (I'd be happy to hear a better way to do this.) I then > created a new file that handles the translation (pasted below). One should > be able to easily expand this to add the other native PostgreSQL geometric > data types. > > Cheers, > Demitri > > --- > > > > ''' > These classes define native PostgreSQL geometry types to be used with > SQLAlchemy. > > Ref: http://www.postgresql.org/docs/9.4/static/datatype-geometric.html > ''' > > from sqlalchemy.types import TypeDecorator, VARCHAR > > class PGPolygon(TypeDecorator): > """Represents the native polygon data type in PostgreSQL (i.e. *not* > PostGIS). > > Usage:: > > polygonColumnName = Column('polygon_column_name', PGPolygon) > > """ > > impl = VARCHAR > > def process_bind_param(self, value, dialect): > ''' > Take the object and convert it into a string to be entered into > the database. > The value should be in the form of a Python list of tuples, e.g. > [ (x1,y1), (x2,y2), (x3,y3), ... ] > ''' > if value is not None: > value = "({0})".format(",".join([str(x) for x in value])) > return value > > def process_result_value(self, value, dialect): > ''' > Take the polygon value from the database and convert it into a > list of point tuples. > > The incoming format looks like this: '((12,34),(56,78),(90,12))' > ''' > if value is not None: > polygon = list() > for point in value[1:-1].split("),("): # also strip outer > single quotes > point = point.lstrip("(") # remove extra "(" ")" (first > and last elements only) > point = point.rstrip(")") > x, y = point.split(",") > polygon.append((float(x), float(y))) > value = polygon > return value > > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.