Проблема с типами данных при переходе из Salesforce в Azure SQL с использованием pyodbc в Python

#python #salesforce #azure-sql-database #pyodbc #devart

#python #salesforce #azure-sql-database #pyodbc #devart

Вопрос:

Я передаю данные из Salesforce в базу данных SQL Azure, используя Python с pyodbc.

Я устанавливаю первое соединение с Salesforce, как показано ниже:

 cnxn = pyodbc.connect('DRIVER={Devart ODBC Driver for Salesforce};User ID=xxx;Password=xxx;Security Token=xxx')
 

Затем я импортирую данные Salesforce, как показано ниже:

 cursor = cnxn.cursor()
cursor.execute("select * from X where Y > 'VALUE'")
row = cursor.fetchall()
 

После этого я устанавливаю второе соединение с местом назначения, которым является база данных SQL Azure, как показано ниже:

 cnxn = pyodbc.connect('DRIVER={Devart ODBC Driver for SQL Azure};Server=xxx;Database=xxx;Port=1433;User ID=xxx;Password=xxx')
 

До сих пор все работает нормально. Но когда я пытаюсь вставить выходные данные, полученные из Salesforce (в переменной строке) Я сталкиваюсь с проблемами типов данных, из которых мы можем привести:

  • Таблицы » t»
  • Вернемся к знаку строки (в базе данных SQL Azure — CHAR(13) CHAR(10) )
  • Символы, содержащие кавычки (например, «технология больших данных»)

Вот как я запускаю запрос вставки:

 cursor.executemany('INSERT INTO dbo.Account (Column_a,Column_b,Column_c) VALUES (?,?,?,?)', row)
cursor.commit()
 

Вот первая ошибка, которую я получаю:

 pyodbc.Error: ('HY000', '[HY000] [Devart][ODBC][Microsoft SQL Azure]Statement(s) could not be prepared.rnMust declare the scalar variable "@_39".rnLine 1: Specified scale 14 is invalid. (0) (SQLExecDirectW)')
 

Комментарии:

1. Для подключения к Azure вы можете попробовать использовать Microsoft «Драйвер ODBC 17 для SQL Server» и посмотреть, работает ли это лучше? Проблема со строками, содержащими одинарные кавычки, даже при использовании параметризованного запроса, заставляет меня подозревать ошибку в драйвере Devart.

2. Также обратите внимание, что использование INSERT INTO table_name VALUES … (без списка столбцов) считается дурным тоном. Вы действительно должны использовать INSERT INTO table_name (col_a, col_b, col_c, col_d) VALUES (?,?,?,?)

Ответ №1:

Эта проблема, по-видимому, была вызвана дефектом в

 Devart ODBC Driver for SQL Azure
 

Использование Microsoft

 ODBC Driver 17 for SQL Server
 

решена проблема.