Как вставить географические данные на сервер SQL с помощью Python jaydebiapi cursor.executemany ()? - PullRequest
0 голосов
/ 04 мая 2020

Я вставил данные в SQL Сервер, используя cursor.execute().

Вот мой фрагмент кода:

insert_str = """INSERT INTO [test].[DBO].[SPATIAL] VALUES({},{});"""

geography = "geography::STGeomFromText('LINESTRING(-95.323167 29.985500, -95.323333 29.985500)', 4326)"

cursor.execute(insert_str.format(123, geography))

Но когда я использую cursor.executemany() с фрагментом кода ниже , это не сработало:

insert_str = """INSERT INTO [test].[DBO].[SPATIAL] VALUES(?,?);"""

geography = "geography::STGeomFromText('LINESTRING(-95.323167 29.985500, -95.323333 29.985500)', 4326)"

cursor.executemany(insert_str, [(122, geography)])

Это журнал трассировки:

Traceback (most recent call last):
  File "spatial_point.py", line 35, in <module>
    run()
  File "spatial_point.py", line 33, in run
    cursor.executemany(insert_str, [(122, geography)])
  File "/root/anaconda3/lib/python3.7/site-packages/jaydebeapi/__init__.py", line 518, in executemany
    update_counts = self._prep.executeBatch()
jpype._jexception.BatchUpdateExceptionPyRaisable: java.sql.BatchUpdateException: A .NET Framework error occurred during execution of user-defined routine or aggregate "geography":
System.FormatException: 24114: The label geography::STGeomFro in the input well-known text (WKT) is not valid. Valid labels are POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, COMPOUNDCURVE, CURVEPOLYGON and FULLGLOBE (geography Data Type only).
System.FormatException:
   at Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(String input)
   at Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type)
   at Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)

Кто-нибудь знает, что здесь происходит не так? Спасибо

1 Ответ

0 голосов
/ 07 мая 2020

Первый подход просто форматирует текст INSERT INTO [test].[DBO].[SPATIAL] VALUES({},{}); и заменяет позиционные аргументы значениями 123 и "geography::STGeomFromText('LINESTRING(-95.323167 29.985500, -95.323333 29.985500)', 4326)".

Во втором подходе используются заполнители, поэтому оператор должен быть другим. Вам необходимо передать WKT-представление экземпляра geography и идентификатор пространственной привязки в качестве параметров для вызова geography::STGeomFromText:

insert_str = """INSERT INTO [test].[DBO].[SPATIAL] VALUES(?, geography::STGeomFromText(?, ?);"""
cursor.executemany(insert_str, [(122, 'LINESTRING(-95.323167 29.985500, -95.323333 29.985500)', 4326)])
...