我想自动化数据库的设置,并且我想通过使用 python 脚本在 Linux 终端中执行一些命令来实现。
但是连接mysql数据库后我在终端中看不到任何执行命令的方法。
下面您可以看到脚本的一部分:
from time import sleep
from os import system
print("Setting up the database...\n")
system("sudo mysql -u root")
sleep(2)
这会启动 mysql,之后我尝试从 python 执行的命令都不会被执行。
例如,我想运行如下命令:
system("CREATE DATABASE mydatabase;")
system("CREATE USER 'user'@'localhost' IDENTIFIED BY '[PASSWORD]';")
system("GRANT ALL PRIVILEGES ON mydatabase.* TO 'user'@'localhost';")
这可能吗?
编辑 1:@AndHeFallen 建议的潜在解决方案:
在 python 中,我创建一个名为 db.sql 的 sql 文件,然后在终端中运行它:
with open("db.sql","w") as db:
db.write("CREATE DATABASE mydatabase;\n")
db.write("CREATE USER 'user'@'localhost' IDENTIFIED BY '[PASSWORD]';\n")
db.write("GRANT ALL PRIVILEGES ON mydatabase.* TO 'user'@'localhost';\n")
system("sudo mysql -u root < db.sql")
我认为不可能做到这一点。如果您想使用 Python 脚本与 MySQL 数据库交互,则需要使用 MySQLdb 等 api 直接连接到您的数据库。 (我可能是错的,但你想要的方式可能会导致安全问题)
当然可以。
我有类似的东西可以自动执行特定应用程序的更新过程。
基本上,使用
subprocess.check_call
就足够了。
它将处理任何异常或错误输出,并根据需要停止/继续执行。
我什至能够使用
pv
来监控mysql数据传输
# this is the command I need to run
$ pv /resources/sql/script_sample.sql | mysql --defaults-file=/resources/config/config-local-dev.cnf --protocol=tcp --default-character-set=utf8mb4 --database=my_sample_db
# my python script
run(
command="pv /resources/sql/script_sample.sql | mysql --defaults-file=/resources/config/config-local-dev.cnf --protocol=tcp --default-character-set=utf8mb4 --database=my_sample_db",
)
来源:
import subprocess
class ShellColors:
"""Shell Colors"""
HEADER = "\033[95m"
OKBLUE = "\033[94m"
OKCYAN = "\033[96m"
OKGREEN = "\033[92m"
WARNING = "\033[93m"
FAIL = "\033[91m"
ENDC = "\033[0m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"
def run(command=""):
"""run command"""
try:
terminal_color = (ShellColors.WARNING, "")[allow_execution]
subprocess.check_call(command, shell=True)
print(f"{terminal_color}{command}{ShellColors.ENDC}")
except subprocess.CalledProcessError as error:
print(f"{ShellColors.FAIL}ERROR: {error}{ShellColors.ENDC}")
raise subprocess.CalledProcessError from error