我在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
答案 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"中包含字段名称。格式。