10

I have a MySQL update script I'd like to run from the command line, but I want to be able to pass a stage domain variable to the script.

I know this won't work, but it's the best way I can describe what I'm trying to do:

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

Inside the script, I'm using the @domain variable, to update some configuration variables in a config table, using commands like this:

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

Basically I want to prefix the SET @domain on the update_domain.sql file.

Any ideas how I can rectify my approach?

4 Answers 4

13

In your BATCH File :

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

And in you SQL file :

UPDATE my_cfg SET value = @domain WHERE name = 'DOMAIN';
Sign up to request clarification or add additional context in comments.

2 Comments

I get a syntax error unless I put a semicolon after the source command
It looks like this may not work in mysql 5.6 ? source works interactively, but doesn't seem to work when passed in the -e parameter.
4

you can do that with sed like this:

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

or update.sql has UPDATE:

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

1 Comment

And of course, in case of a sh script, use double quote in the sed part to pass the new value as variable. i.e. cat update.sql | sed "s/#domain#/$some_var/" | mysql -uusername -ppassword dbname
3

I've found a better solution.

--init-command=name SQL Command to execute when connecting to MariaDB server.

mysql --init-command="SET @foo = 1; SET @bar = 2" -e "SELECT @foo, @bar, VERSION()"

Output:

+------+------+-------------------------------------+
| @foo | @bar | VERSION()                           |
+------+------+-------------------------------------+
|    1 |    2 | 10.6.3-MariaDB-1:10.6.3+maria~focal |
+------+------+-------------------------------------+

It also works with file redirection.

Comments

2

This works for me:

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")

...calling with system() from Capistrano.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.