Я пишу скрипт на python, который просматривает список объектов продаж. из списка он идентифицирует столбцы, затем извлекает данные и преобразует их во фрейм данных. При записи в БД (MSSQL) некоторые поля являются упорядоченными словарями, которые не записываются и вызывают ошибку "
ProgrammingError: (pyodbc.ProgrammingError) ('Неверный тип параметра. Param-index = 17 param-type = collection.OrderedDict', 'HY105')
исходная система - salesforce, и я пишу в базу данных MSSQL. Я не хочу создавать отдельный сценарий для каждого объекта и надеялся написать динамический сценарий. Пока все работает, ожидайте, когда столбец будет упорядоченным диктитом. К сожалению, когда я использую dtype в столбцах фрейма данных, он идентифицируется как «объект»
Полагаю, я бы хотел включить шаг, который идентифицирует столбцы как содержащие заказные, а затем руководство по их преобразованию в строки.
import pandas as pd
from simple_salesforce import Salesforce
import urllib
import sqlalchemy as sa
sf = Salesforce(instance_url ='###########################'
,username='###################', password='#############',
security_token='###################')
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client
11.0};"
"SERVER=#########;"
"DATABASE=#############;"
"trusted_connection=yes;")
engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=
{}".format(params))
con = engine.connect()
ObjectList =
ObjectList[ObjectList[0:].isin
(['PermissionSetAssignment','PermissionSet','FieldPermissions','ObjectPermissions','UserRole','permissionsetassignment','Profile','Campaign','Order','User','Subindustry__c','Quote','RecordType','Opportunity','Lead','Industry__c','Contact','Airport__c','Account','Event'])]
ObjectList = list(ObjectList)
def Sales_Force_Extract(x):
y = 'stg_sf_%s' %x
sql = 'select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where
TABLE_NAME = \'%s\' and not COLUMN_NAME in
(\'hash\',\'insert_id\',\'insert_usr\',\'insert_dt\')' %y
db_columns = pd.read_sql_query(sql,con)
db_columns= db_columns['COLUMN_NAME']
desc = eval("sf.%s.describe()" % x)
sf_columns = [field['name'] for field in desc['fields']]
columns = db_columns[db_columns.isin(sf_columns)].tolist()
soql = "SELECT {} FROM %s".format(','.join(columns)) %x
qryResult = sf.query_all(soql)
df = pd.DataFrame(qryResult['records'])
df = df.drop('attributes',axis = 1)
truncate_query = sa.text("truncate table staging."+y+'_2')
con.execution_options(autocommit=True).execute(truncate_query)
df.to_sql(name=y,con=engine, if_exists='append',index=False, schema="staging")
for x in ObjectList:
try:Sales_Force_Extract(x)
except: pass
как указано, ошибка
'Неверный тип параметра. param-index = 0 param-type = collection.OrderedDict ',' HY105 ') [SQL: INSERT INTO staging.stg_sf_account]
Я знаю, что это связано с попыткой вставить OrderedDict в столбец varchar (max) в БД.