使用sqlalchemy core调用GeomFromText和其他此类函数

时间:2016-04-27 23:41:29

标签: python mysql sqlalchemy

我在python中使用MySQL数据库。我有一个使用MySQL几何扩展的表,所以我需要在更新语句中调用GeomFromText MySQL函数,如下所示:

UPDATE myTable SET Location=GeomFromText('Point(39.0 55.0)') where id=1;
UPDATE myTable SET Location=GeomFromText('Point(39.0 55.0)') where id=2;

最初,我使用的是低级MySQLdb库。我转而使用SQLAlchemy核心库(由于速度和其他原因,我无法使用SQLAlchemy ORM)。

如果我直接使用较低级别的MySQLdb库,我会这样做:

import MySQLdb as mysql
commandTemplate = "UPDATE myTable SET Location=GeomFromText(%s) where id=%s"
connection = mysql.connect(host="myhost",user="user",passwd="password",db="my_schema")
cursor = connection.cursor(mysql.cursors.DictCursor)
data = [
    ("Point(39.0 55.0)",1),
    ("Point(39.0 55.0)",2),
]
cursor.executemany(commandTemplate,data)

如何使用SQLAlchemy核心获得等效功能?

没有GeomFromText,我认为它看起来像这样(感谢this answer):

from sqlalchemy.sql.expression import bindparam

updateCommand = myTable.update().where(id=bindparam("idToChange"))
data = [
    {'idToChange':1,'Location':"Point(39.0 55.0)"},
    {'idToChange':2,'Location':"Point(39.0 55.0)"},
]
connection.execute(updateCommand,data)

我不能用“GeomFromText('Point(39.0 55.0)')”将文字替换为“Point(39.0 55.0)”,或者我得到:

Cannot get geometry object from data you send to the GEOMETRY field

1 个答案:

答案 0 :(得分:0)

到目前为止,我找到的最简单的方法是使用text(即构造TextClause个对象),它允许您逐字地输入SQL语法。

我的例子可以这样:

from sqlalchemy.sql.expression import bindparam
from sqlalchemy import text

updateCommand = myTable.update().where(id=bindparam("idToChange"))
valuesDict = {'idToChange':':idToChange', 
              'Location':text("GeomFromText(:_location)")
}
updateCommand = updateCommand.values(**valuesDict)
data = [
    {'idToChange':1,'_location':"Point(39.0 55.0)"},
    {'idToChange':2,'_location':"Point(39.0 55.0)"},
]
#see the MySQL command as it will be executed (except for data)
print(connection.compile(bind=connection))
#actually execute the statement
connection.execute(updateCommand,data)

关键点:

  • 调用updateCommand.values替换SQL子句的VALUES部分。只有您作为此次调用的kwargs提供的列才会实际放入最终的UPDATE语句

  • updateCommand.values的关键字参数的值可以是文字的一组数据(如果您只更新一行),也可以是一个字符串,在{中提供键的名称{1}}最终将使用命令传递给data方法的字典。要使用的格式是ColumnName =":dictionaryKeyName"。

  • 关键字参数的值也可以是connection.execute子句的结果,该子句本身可以在同一个":dictionaryKeyName"中包含字段名称。格式。