OK, for the function execution, the syntax that works with release 0.3.5 is:
conn = db.connect() trans = conn.begin() conn.execute(func.AddGeometryColumn ('','gis_entity','fpos',-1,'LINESTRING',2).select()) trans.commit() conn.close() notice it just adds a select(). in changeset 2364, you dont need the select. inserts with functions are done like this: # without a connection table.insert().execute(somecolumn = func.GeometryFunction(arg1, arg2, arg3...)) # with a connection conn.execute(table.insert(), somecolumn = func.GeometryFunction(arg1, arg2, arg3...)) On Feb 27, 2007, at 10:42 AM, Michael Bayer wrote: > > these are all SA bugs/possible inaccuracies in API usage. you should > be able to execute the function as I described below, you should be > able to put the function into an INSERT statement as well. Ill test > these features later today. > > On Feb 25, 2007, at 3:43 PM, Allen Bierbaum wrote: > >> >> I tried your idea but it doesn't seem to be valid code. Here is the >> code I tried: >> >> print "Trying with a transaction." >> conn = db.connect() >> trans = conn.begin() >> conn.execute(sa.func.AddGeometryColumn >> ('','gis_entity','fpos',-1,'LINESTRING',2)) >> trans.commit() >> conn.close() >> >> and here is the exception I get on the execute line: >> >> Try with a transaction. >> INFO:sqlalchemy.engine.base.Engine.0x..d0:BEGIN >> Traceback (most recent call last): >> File "gis_type_test.py", line 73, in ? >> conn.execute(sa.func.AddGeometryColumn >> ('','gis_entity','fpos',-1,'LINESTRING',2, >> engine=db)) >> File "/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", >> line 258, in execute >> return Connection.executors[type(object).__mro__[-2]](self, >> object, *multiparams, **params) >> KeyError: <class 'sqlalchemy.sql._CompareMixin'> >> >> I am now running into a new problem as well though. I can use my >> previous hack to insert the column but I can't add data to it because >> I have been unable to call "GeomFromText(..)" on the insert. >> >> I tried to get this working by defining my own type: >> class GeometryType(sa.types.TypeEngine): >> >> def __init__(self, SRID, typeName, dimension): >> super(GeometryType, self).__init__() >> self.mSrid = SRID >> self.mType = typeName.upper() >> self.mDim = dimension >> >> def __repr__(self): >> return "%s:%s-%s(%s)" % (self.__class__.__name__, self.mType, >> self.mDim, self.mSrid) >> >> def get_col_spec(self): >> return "GEOMETRY" >> >> def convert_bind_param(self, value, engine): >> return 'GeomFromText(\'%s\',%s)'%(value, self.mSrid) >> >> def convert_result_value(self, value, engine): >> # Not used yet >> return value >> >> When I use this with my table and datamapper code, it looks like >> everything is working fine but the generated SQL insert statement >> fails with a exception: >> >> sqlalchemy.exceptions.SQLError: (ProgrammingError) parse error - >> invalid geometry >> 'INSERT INTO gis_entity (id, name, pos) VALUES (%(mId)s, %(mName)s, >> %(mPos)s)' {'mName': 'New entity', 'mId': 1L, 'mPos': >> "GeomFromText('POINT(100 100)',-1)"} >> >> I know from using sql directly in pgadmin3 that this line works >> correctly: >> >> insert into gis_entity (id, name, pos) values (2, 'New entity', >> GeomFromText('POINT(100 100)', -1)); >> >> Does anyone see how this varies from the sql statement issued by SA? >> I have stared at it for 20 minutes and I don't see a difference. >> Is there any way to see the raw SQL statement sent by SA to postgres? >> I have turned up the debug output level to full but I still only can >> see the format string and parameters used for making the sql >> statement: >> >> INFO:sqlalchemy.engine.base.Engine.0x..50:INSERT INTO gis_entity (id, >> name, pos) VALUES (%(mId)s, %(mName)s, %(mPos)s) >> INFO:sqlalchemy.engine.base.Engine.0x..50:{'mName': 'New entity', >> 'mId': 1L, 'mPos': "GeomFromText('POINT(100 100)',-1)"} >> >> Does anyone see what I am doing wrong here? >> >> Once I get this working, then I have to figure out how to get the >> data >> back out from postgis. What I want to end up with here is an SQL >> statement like this: >> >> select id, name, AsText(pos) as pos from gis_entity; >> >> Note that pos is retrieved through a server side function ('AsText') >> that unpacks the binary representation from the database into a >> string >> representation. Is there any way to do this with SA so the system >> will always create queries in this form whenever it tries to retrieve >> the value of pos? >> >> I don't know if this makes a solution easier, but I am using mappers >> for all my tables. What I would really like to have is a mapper that >> would just automatically know to wrap all references to "pos" in >> INSERT calls with a call to the server-side function 'GeomFromText' >> and correspondingly wrap all references to "pos" in SELECT calls with >> a call to the server-side function 'AsText'. Is it possible to do >> this at the mapper level? If it is, then that could greatly simplify >> everything I am trying to do here. >> >> Thanks for you help. >> >> -Allen >> >> On 2/25/07, Michael Bayer <[EMAIL PROTECTED]> wrote: >>> >>> if the function youre calling needs a transaction commit, why dont >>> you call an explicit transaction ? >>> >>> conn = engine.connect() >>> trans = conn.begin() >>> conn.execute(func.AddGeometryColumn >>> ('','gis_entity','fpos',-1,'LINESTRING',2)) >>> trans.commit() >>> >>> >>> On Feb 25, 2007, at 11:02 AM, Allen Bierbaum wrote: >>> >>>> >>>> I have been pursuing this further on my own and one of the issues I >>>> have run into is how to cleanly add a geometry column to a >>>> database. >>>> The posting referenced in the first e-mail [2] talks about doing >>>> this >>>> directly with psycopg2 cursor because the poster could not get it >>>> working with SA. I gave it another try to see if I could get it >>>> working and I think I have narrowed down the problem. That said, I >>>> still don't fully understand how to fix it with SA only. >>>> >>>> Here is my code example: >>>> >>>> ---------------------------- >>>> db = sa.create_engine(dsn_str) >>>> >>>> # Option 1: Try using a function on the database (doesn't work) >>>> print "Run with func" >>>> db.func.AddGeometryColumn('','gis_entity','fpos',-1,'LINESTRING', >>>> 2).execute() >>>> >>>> # Option 2: Try directly with database statement execution (doesn't >>>> work) >>>> print "Run on db" >>>> r = db.execute("select >>>> AddGeometryColumn('','gis_entity','cpos',-1,'LINESTRING',2)") >>>> r.close() >>>> >>>> # Option 3: use psycopg to execute directly without autocomit? >>>> (works) >>>> print "Run with psycopg isolation level" >>>> con = db.connect() >>>> con.connection.connection.set_isolation_level >>>> (psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) >>>> con.execute("select >>>> AddGeometryColumn('','gis_entity','p_pos',-1,'LINESTRING',2)") >>>> con.close() >>>> ------------------------ >>>> >>>> >>>> So option 3 works, but I don't fully understand why it works and >>>> why I >>>> can't use one of the other options. Option 1 is definitely my >>>> preferred way to do this because it will make the calls look like >>>> normal SA calls to a DB function. >>>> >>>> Can anyone tell my whey option 3 is working and if there is a >>>> way to >>>> do this directly with SA only? >>>> >>>> Thanks, >>>> Allen >>>> >>>> >>>> On 2/23/07, Allen <[EMAIL PROTECTED]> wrote: >>>>> >>>>> I would like to use SqlAlchemy with PostGIS to create, read, >>>>> update, >>>>> and query spatial data. I have search around a bit and found a >>>>> few >>>>> ideas of doing this [1][2] but I haven't seen a definitive best >>>>> practice by any means. It looks like all the solutions I can find >>>>> have a least some limitations. >>>>> >>>>> Is anyone here using SqlAlchemy with spatial databases and if so >>>>> how >>>>> are you doing it right now? >>>>> >>>>> Specifically: >>>>> - How do you handle table specification with geometry types? >>>>> [1] tries to do this but it is incomplete >>>>> >>>>> - Do you use custom types and if so how are you doing this? >>>>> [2] has some custom type code but it seems to be tied to binary >>>>> formats and I don't see how to create/retrieve the geometry in >>>>> text >>>>> format. >>>>> >>>>> - How are you handling the object mapping? >>>>> For example is there a way to map a "POINT" geometry to a python >>>>> Point >>>>> class or tuple? >>>>> >>>>> - Do you have any general recommendations for how to use spatial >>>>> data >>>>> successfully with SqlAlchemy? >>>>> >>>>> >>>>> Thanks, >>>>> Allen >>>>> >>>>> [1] http://www.mail-archive.com/sqlalchemy- >>>>> [EMAIL PROTECTED]/msg03371.html >>>>> [2] http://bycycle.org/2007/01/29/using-postgis-with-sqlalchemy/ >>>>> >>>>> >>>>>> >>>>> >>>> >>>>> >>> >>> >>>> >>> >> >>> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---