質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

520閲覧

DB連携 salesforce mysql

beginner_py

総合スコア13

Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/06/12 07:10

編集2018/06/15 01:45

お見苦しいソースですが、salesforceとmysqlのデータ連携を図っておりまして、
salesfoceへの接続 s2hdb.py
アップデーター  s2h_updater.py
下記プログラム  samlple.com
mysqlの最新更新日とsalesforceの最終更新日を比較しsalesforce側の日付が新しければmysql側をupsertするというプログラムです。
実行すると
File "/home/dbcon/sample.py", line 96, in lo_update_companies
cur.execute(q)
UnboundLocalError: local variable 'q' referenced before assignment
とエラーが出てしまします。
色々試したのですが解決できず。。。。
解決方法を教えていただきたいです。

python2.7

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3import s2hdb 4from datetime import datetime as dt 5from operator import add 6# 7# Salesforce handle Functions 8# 9def sf_get_last_modified_date(): 10 sf = s2hdb.sf_get_descriptor() 11 q = "SELECT LastModifiedDate FROM Account " + \ 12 "ORDER BY LastModifiedDate DESC LIMIT 1" 13 r = sf.query_all(q) 14 last_modified = dt.strptime(r["records"][0]["LastModifiedDate"], 15 '%Y-%m-%dT%H:%M:%S.000+0000') 16 return last_modified 17def sf_get_updated_companies(last_modified): 18 sf = s2hdb.sf_get_descriptor() 19 q = "SELECT Name, Website, Description, Description_JP__c, " + \ 20 "Core_Technology__c, Core_Technology_JP__c, Development_Status__c, " + \ 21 "Development_Status_JP__c, Application__c, Application_JP__c, Tags__c" + \ 22 " FROM Account WHERE LastModifiedDate > " + \ 23 last_modified.strftime('%Y-%m-%dT%H:%M:%S.000+0000') 24 results = sf.query_all(q) 25 coms = [] 26 for r in results["records"]: 27 com = [] 28 elements = ['Name', 'Website', 'Description', 'Description_JP__c', 29 'Core_Technology__c', 'Core_Technology_JP__c', 'Development_Status__c', 30 'Development_Status_JP__c', 'Application__c', 'Application_JP__c', 'Tags__c'] 31 elements = [str(e) for e in elements] 32 for e in elements: 33 # Convert NoneType Object as "" 34 if (r[e] is None): 35 r[e] = str("") 36 r[e] = r[e].encode('utf-8') 37 r[e] = r[e].replace('\'', '\'\'') 38  if (e == 'Tags__c'): 39 if (r[e] is None): 40 r[e] = str("") 41 com.append('{0}'.format(r[e]).strip().split(";")) 42 else: 43 com.append('\'{0}\''.format(r[e])) 44 # Duplication check. 45 # It seems salesforce returns duplicated records. 46 duplicated = False 47 for c in coms: 48 if coms[0] == '\'{0}\''.format(r["Name"]): 49 duplicated = True 50 if (duplicated is True): 51 continue 52 coms.append(com) 53 return coms 54# 55# Local DB handle functions 56# 57def lo_get_last_modified_date(): 58 con = s2hdb.lo_get_descriptor() 59 cur = con.cursor() 60 q = "SELECT last_modified from company ORDER BY last_modified DESC LIMIT 1" 61 cur.execute(q) 62 if (cur.rowcount == 0): 63 # We want to move all from salesforce, so just set very early date 64 last_modified = dt.strptime("2000/1/1 00:00:00", '%Y/%m/%d %H:%M:%S') 65 else: 66 last_modified = cur.fetchone()[0] 67 cur.close() 68 return last_modified 69def lo_update_companies(data): 70 if (len(data) == 0): 71 return 72 con = s2hdb.lo_get_descriptor() 73 cur = con.cursor() 74 coms = [] 75 for t in data: 76 coms.append(t[0:10]) 77 q = "INSERT INTO company(legal_name, website, desc, desc_jp, " + \ 78 "core_tech, core_tech_jp, " + \ 79 "development_status, development_status_jp, application, application_jp, cat_name) " + \ 80 "VALUES " + \ 81 ", ".join(map(lambda x: "(" + ",".join(x) + ")", coms)) + " " + \ 82 "ON DUPLICATE KEY UPDATE legal_name = VALUES (legal_name)" + \ 83 cur.execute(q) 84 cur.close() 85 con.commit() 86コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

複数行に渡る式の連結における文法的な誤りが原因です。
"ON DUPLICATE KEY UPDATE legal_name = VALUES (legal_name)" + \の最後の + \が不要です。

以下、単純な再現コードです。

Python

1def func(): 2 s = "abc" + \ 3 "def" + \ 4 len(s) # UnboundLocalError: local variable 's' referenced before assignment 5 6func()

投稿2018/06/12 09:05

can110

総合スコア38234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner_py

2018/06/12 10:10

コメントありがとうございます。 下記のエラーの解決策も教えていただけますと幸いです。 mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc, desc_jp, core_tech, core_tech_jp, development_status, development_status_j' at line 1
can110

2018/06/12 10:14

構文を修正したうえで別のエラーが発生したということでしょうか? コード処理内容については把握しておりませんが「You have an error in your SQL syntax;」 よりSQL構文エラーが発生しているようです。
beginner_py

2018/06/12 10:15

構文を修正した後複数個のエラーを修正した後上記のエラーが発生しまして、解決できておりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問