Чтение значений laravel .env в терминале windows и использование их в качестве учетных данных для mysql в командном файле - PullRequest
1 голос
/ 11 февраля 2020

Я создал скрипт .bat для импорта нескольких .csv в моей БД для проекта Laravel.

Сначала я использовал python, и каждый раз для восстановления длинных файлов требовалась вечность поэтому я решил создать резервную копию этих таблиц и восстановить их с MySQL.

старым .bat файлом

echo.
echo - Rebuilding database
php artisan migrate:fresh

echo.
echo - Importing animals data
cd py_animalimporter
python importer.py
cd ..

echo.
echo - Importing colors data
cd py_colorimporter
python importer.py
cd ..

echo.
echo - Rebuilding database
php artisan db: seed

echo.
echo - Importing places data
cd py_placeimporter
python importer.py
cd ..

echo.
echo - Starting local server
php artisan serve

новым .bat файлом

echo.
echo - Rebuilding database
php artisan migrate:fresh

echo.
echo - Restoring sql backup
mysql -u username -p test_local < backup.sql
password

echo.
echo - Rebuilding database
php artisan db: seed

echo.
echo - Importing places data
cd py_placeimporter
python importer.py
cd ..

echo.
echo - Starting local server
php artisan serve

My python скрипты читают MySQL учетные данные из моего laravel .env файла (благодаря библиотеке dotenv), к сожалению, я не могу понять, как сделать что-то подобное с терминала windows.

. env file

DB_HOST=127.0.0.1
DB_PORT=3308
DB_DATABASE=test_local
DB_USERNAME=username
DB_PASSWORD=password

.py пример файла

from dotenv import load_dotenv
from pathlib import Path
import os
import mysql.connector
from mysql.connector import errorcode

def connectDb():
    # Retrieve db credentials from .env
    env_path = '../.env'
    load_dotenv(dotenv_path=env_path)

    db_host = os.getenv("DB_HOST")
    db_port = os.getenv("DB_PORT")
    db_database = os.getenv("DB_DATABASE")
    db_username = os.getenv("DB_USERNAME")
    db_password = os.getenv("DB_PASSWORD")

    if db_password is None:
        db_password = ''

    return mysql.connector.connect(user=db_username, password=db_password,
                                    host=db_host,
                                    port=db_port,
                                    database=db_database)

def insertPrimaryColour(hex,color):
    try:
        cnx = connectDb()
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            print("] Wrong Credentials")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            print("] No Existing Database")
        else:
            print("] " + err)
    else:
        cursor = cnx.cursor()

        query = f"INSERT INTO dom_colors(`order`,hex,id_translation) VALUES(0,'{hex}','{color}');"
        cursor.execute(query)
        insert_id = cursor.lastrowid

        cnx.commit()
        cnx.close()

    return insert_id

С другой стороны, я мог бы использовать python для восстановления БД, но все, что я пробовал, не работало!

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Если вы хотите создать независимое решение ad os, вы можете попробовать использовать подпроцесс .

. Вы можете использовать таким образом:

mysqlLogin = [...]

process = subprocess.Popen(mysqlLogin, shell=True, stdout=subprocess.PIPE)
process.wait()

Эта строка кода запустит команду, содержащуюся в mysqlLogin и будет ждать его завершения.

Вы также можете настроить стандартное перенаправление вывода с параметрами stdout .

Здесь документы: https://docs.python.org/3/library/subprocess.html

0 голосов
/ 11 февраля 2020

Я наконец-то нашел решение с помощью Python отправки кода на терминал Windows!

Вот скрипт Python, который я сейчас вызываю из командного файла

from dotenv import load_dotenv
from pathlib import Path
import os

def restoreDB():
    # Retrieve DB credentials from .env
    env_path = '.env'
    load_dotenv(dotenv_path=env_path)

    #db_host = os.getenv("DB_HOST")
    #db_port = os.getenv("DB_PORT")
    db_database = os.getenv("DB_DATABASE")
    db_username = os.getenv("DB_USERNAME")
    db_password = os.getenv("DB_PASSWORD")

    if db_password is "":
        mysqlLogin = "mysql -u "+db_username+" "+db_database+" < backup.sql"
    else:
        mysqlLogin = "mysql -u "+db_username+" --password='"+db_password+"' "+db_database+" < backup.sql"
    os.system('cmd /c "%s"' % mysqlLogin)

restoreDB()
...