2

Azure Databricks で Python スクリプトを起動して、Salesforce データを Azure SQL Database に段階的に読み込もうとしています。

Devart ODBC を Azure Databricks にインストールできないため、simple_salesforce を使用して salesforce からデータを取得しようとしています。

import pandas as pd
import pyodbc
from simple_salesforce import Salesforce, SalesforceLogin, SFType
from sqlalchemy.types import Integer, Text, String, DateTime
from sqlalchemy import create_engine
import urllib

sf = Salesforce(password = password, username=username, security_token=jeton)
rep_qr = "SELECT SOMETHING FROM Account WHERE CONDITION"
soql = prep_qr.format(','.join(field_names))
results = sf.query_all(soql)['records']

次の結果が得られます(例):

[OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v42.0/sobjects/Account/0014K000009aoU3QAI')])), ('Id', XY1), (Name, Y), (Date, 2020-11-24T09:16:17.000+0000)])]

次に、出力を pandas Dataframe に変換しました。

results = pd.DataFrame(sf.query_all(soql)['records'])
results.drop(columns=['attributes'], inplace=True) #to keep only the columns

私はこのようなものを得ました(ほんの一例):

ID 名前 日にち
XY1 2020-11-24T09:16:17.000+0000

このデータを Azure SQL データベースに取り込むために、「sqlalchemy」を使用してデータフレームを sql に変換しました。次に示すように、pyodbc が宛先 (Azure SQL データベース) への挿入部分を担当します。

df = pd.DataFrame(results)
df.reset_index(drop=True, inplace=True) #just to remove the index from dataframe

#Creating the engine from and pyodbc which is connected to Azure SQL Database:
params = urllib.parse.quote_plus \
                (r'DRIVER={ODBC Driver 17 for SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password)
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params)
engine_azure = create_engine(conn_str, echo=True)
df.to_sql('account',engine_azure,if_exists='append', index=False)

しかし、次のエラーが表示されます。

sqlalchemy.exc.DataError: (pyodbc.DataError) ('22007', '[22007] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Conversion failed when converting date and/or time from character string. (241) (SQLExecDirectW)')

問題は、ライブラリ simple_salesforce が日付/時刻を次の形式で表示していることだと思います。

2020-11-24T09:16:17.000+0000

ただし、Azure SQL データベースでは、次のようになります。

2020-11-24T09:16:17.000

ここでの問題は、テーブルを動的にロードしていることです (ロードしているテーブルも列もわかりません)。これらのデータ型をキャストできない理由は、データ型を pyodbc に渡す方法が必要です。自動的。

何をお勧めしますか?

ありがとう、

4

1 に答える 1