Как я могу написать упорядоченный словарь в таблицу как часть динамического SQL - PullRequest
0 голосов
/ 21 июня 2019

Я пишу скрипт на 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) в БД.

...