【问题标题】:calling GeomFromText and other such functions using sqlalchemy core使用 sqlalchemy 核心调用 GeomFromText 和其他此类函数
【发布时间】:2016-04-27 23:41:28
【问题描述】:

我在 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)

我不能直接将“Point(39.0 55.0)”替换为“GeomFromText('Point(39.0 55.0)')”,否则我会得到:

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

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    到目前为止,我发现的最简单的方法是使用 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 的关键字参数的值可以是一组文字数据(如果您只更新一行),也可以是给出data 中键名的字符串最终将与命令一起传递给connection.execute 方法的字典。使用的格式是 ColumnName=":dictionaryKeyName"。

    • 关键字参数的值也可以是text 子句的结果,它本身可以包含相同“:dictionaryKeyName”格式的字段名。

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多