使用Python在linux终端执行mysql命令

问题描述 投票:0回答:2

我想自动化数据库的设置,并且我想通过使用 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 linux terminal command
2个回答
1
投票

我认为不可能做到这一点。如果您想使用 Python 脚本与 MySQL 数据库交互,则需要使用 MySQLdb 等 api 直接连接到您的数据库。 (我可能是错的,但你想要的方式可能会导致安全问题)


0
投票

当然可以。

我有类似的东西可以自动执行特定应用程序的更新过程。

基本上,使用

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

© www.soinside.com 2019 - 2024. All rights reserved.