Какие вы используете библиотеки для работы с базами данных ?

sql
database
mysql
python
Теги: #<Tag:0x00007f7b61b08748> #<Tag:0x00007f7b61b085b8> #<Tag:0x00007f7b61b08478> #<Tag:0x00007f7b61b082e8>

(Вадим) #1

Добрый день !
Хочу результаты тестов сравнивать с данными из базы, использую пример формата :
import pymysql.cursors

Connect to the database

connection = pymysql.connect(host=‘localhost’,
user=‘user’,
password=‘passwd’,
db=‘db’,
charset=‘utf8mb4’,
cursorclass=pymysql.cursors.DictCursor)
print(‘Connect’)

Но получаю ошибку :
pymysql.err.OperationalError: (2003, “Can’t connect to MySQL server on ‘host_name’ ([Errno 8] nodename nor servname provided, or not known)”)

На просторах интернета пока не нашел решения проблемы, может подскажите ? Или есть ли альтернативные библиотеки для работы с БД ?


(Maxim Andryushchenkov) #2
import pymysql


class DBClient:

    def __init__(self, db_cfg):
        self.host = db_cfg['host']
        self.port = db_cfg['port']
        self.username = db_cfg['username']
        self.password = db_cfg['password']
        self.db_name = db_cfg['db_name']
        self.conn = pymysql.connect(host=self.host,
                                    port=self.port,
                                    user=self.username,
                                    password=self.password,
                                    db=self.db_name,
                                    charset='utf8mb4',
                                    cursorclass=pymysql.cursors.DictCursor)
        self.cur = self.conn.cursor()

    def execute(self, query):
        self.cur.execute(query)
        self.conn.commit()
        return self.cur.fetchall()

    def close(self):
        self.cur.close()
        self.conn.close()

Так все работает, этот класс у меня кочует из проекта в проект. А ваша ошибка похожа на недоступность для коннекта. Проверьте порт 3306 на удаленном хосте, к которому подключаетесь (если у вас коннект к удаленной базе). Да и вообще перед кодом всегда надо убедиться ручками что подключиться можно, чтобы проблемы в коде не искать.
Если надо могу закинуть еще реализацию фикстуры клиента для тестов


(Maxim Zaitsev) #3

Я бы посмотрел … Спасибо!


(Maxim Andryushchenkov) #4

Покажу из последнего для монги, а для mysql переделать - 5 сек.
Тут все просто донельзя:

@pytest.fixture()
def dbm_client(request, dbm_config) -> DBMClient:
    """
    Фикстура передает в тест клиента базы данных MongoDB с открытым
    соединением и закрывает это соединение после теста вне зависимости
    от его результата
    """
    client = DBMClient(dbm_config)

    def finalizer():
        client.close()

    request.addfinalizer(finalizer)
    return client

dbm_config - тоже фикстура, которая парсит настройки базы:

@pytest.fixture()
def dbm_config(request, paths) -> dict:
    """
    Фикстура получения конфигурации для базы данных MongoDB
    """
    db = request.config.getoption('--db-mongo')
    return yaml_load(open(path.join(paths['configs'],
                                    'mongo_databases.yml')))[db]

paths - тоже фистура, которая собирает все пути в проекте относительно getcwd(), но ее легко заменить простым путем до конфига.


(Вадим) #5

Благодарю, буду пробовать )