2013-11-22 4 views
5

से स्क्रिप्ट के लिए MySQL चर को पास करें मेरे पास एक MySQL अद्यतन स्क्रिप्ट है जिसे मैं कमांड लाइन से चलाने के लिए चाहता हूं, लेकिन मैं स्क्रिप्ट में एक चरण डोमेन चर पारित करने में सक्षम होना चाहता हूं।कमांड लाइन

मैं जानता हूँ कि यह काम नहीं होगा, लेकिन यह सबसे अच्छा तरीका है मैं मैं क्या करने की कोशिश कर रहा हूँ का वर्णन कर सकते हैं:

$ -uroot -hlocalhost mydatabase --execute "SET @domain = 'mydomain.dev' " < ./sql/update_domain.sql 

स्क्रिप्ट के अंदर, मैं अद्यतन करने के लिए @domain चर का उपयोग कर रहा हूँ, एक config तालिका के कुछ विन्यास चर, इस तरह कमांड का प्रयोग:

UPDATE my_cfg SET value = @domain WHERE name = 'DOMAIN'; 

असल में मैं सेट update_domain.sql फ़ाइल पर @domain उपसर्ग करना चाहते हैं।

कोई विचार मैं अपने दृष्टिकोण को कैसे सुधार सकता हूं?

उत्तर

8

अपने बैच फ़ाइल में:

mysql -e "set @domain=PARAMVALUE;source ./sql/update_domain.sql" 

और तुम एसक्यूएल फ़ाइल में:

UPDATE my_cfg SET value = @domain WHERE name = 'DOMAIN'; 
+0

मैं एक वाक्य रचना त्रुटि मिलती है जब तक कि मैं स्रोत आदेश के बाद अर्धविराम डाल – Jeff

+0

ऐसा लगता है जैसे यह mysql 5.6 में काम नहीं कर सकता है? 'स्रोत' इंटरैक्टिव रूप से काम करता है, लेकिन '-e' पैरामीटर में पारित होने पर काम नहीं करता है। – ebyrob

2

यह मेरे लिए काम करता है:

system("(echo \"SET @domain = 'newstore.personera.abc';\"; cat sql/set_domain.sql) > /tmp/_tmp.sql") 
system("mysql -uroot -hlocalhost newstore.personera.dev < /tmp/_tmp.sql") 
system("rm /tmp/_tmp.sql") 

... प्रणाली() से साथ बुला Capistrano।

3

आप कर सकते हैं कि sed इस तरह के साथ:

echo "UPDATE my_cfg SET value = '#domain#' WHERE name = 'DOMAIN'" | sed 's/#domain#/mydomain.dev/' | mysql -uusername -ppassword dbname 

या Update.sql UPDATE है:

cat update.sql | sed 's/#domain#/mydomain.dev/' | mysql -uusername -ppassword dbname 
+0

और निश्चित रूप से, एक sh स्क्रिप्ट के मामले में, नए मान को चर के रूप में पास करने के लिए sed part में डबल कोट का उपयोग करें। यानी 'बिल्ली अद्यतन.sql | sed "s/# डोमेन #/$ some_var /" | mysql -ususername -ppassword dbname' –