почему моя база данных опустошается при запуске / остановке / перезапуске uWSGI с приложением flask-restful

#mysql #mysql-connector-python

#mysql #mysql-connector-python

Вопрос:

Всякий раз, когда я запускаю / останавливаю / перезапускаю следующую службу

 [Unit]
Description=Application
After=network.target

[Service]
User=root
WorkingDirectory=/var/www/website/backend
Environment="PATH=/var/www/website/backend/myenv/bin"
ExecStart=/usr/bin/uwsgi --http-socket :5000 --plugin python38 --module wsgi:app  --virtualenv /var/www/website/backend/myenv/ --processes 5 --threads 20
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  

Большинство таблиц в базе данных, к которым обращается приложение flask-restful, очищаются.
Эта потеря не ограничивается только данными, введенными приложением.

Кто-нибудь сталкивался с этим? Я пробовал несколько разных вещей, включая переход с mariadb на ванильный mysql 8. Также попытался изменить механизмы хранения на MyISAM из InnoDB на случай, если это была проблема, связанная с откатом, но ничего не сработало.

подключение к mysql через:

 import util

import mysql.connector

def get_conn():
    conn = mysql.connector.connect(
        host="localhost",
        user="admin",
        password="pass/>",
        database="db"
    )
    return conn
  

типичная вставка в БД:

 def create_user(email, password, first_name, last_name, country, promo_date, membership='default', avatar='default.png') -> (bool, str):
    conn = get_conn()
    db = conn.cursor()
   
    db.execute('select email from users where email=%s',(email,)) 
    user = db.fetchone()
    if user is not None:
        return (False, 'Email is already registered')
    
    vid = make_unique_id('verifications', db)
    sql = 'insert into verifications (id, email, verificationDate) values (%s, %s, %s)'
    val = (vid, email, None)
    db.execute(sql, val)
    db.execute('commit')
    sql = 'insert into users (email, country, firstName, lastName, membership, promoDate, avatar, password, registerDate, receivePromoEmails, verified) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    val = (email, country, first_name, last_name, membership, promo_date, avatar, password, util.datenowutc(), True, None)
    db.execute(sql, val)

    db.execute('commit')
    db.close()
    conn.close()

    try: 
        send_verification_email(email, vid)
    except:
        pass

    return (True, 'Successfully added user')
  

типичная конечная точка:

 class RegisterUser(Resource):
    def post(self):
        try:
            parser = reqparse.RequestParser()
            parser.add_argument('email').add_argument('password')
            parser.add_argument('first_name').add_argument('last_name')
            parser.add_argument('country').add_argument('promo_date').add_argument('captcha')
            args = parser.parse_args()

            if not util.verify_captcha(args['captcha']):
                return {'status': 'failure', 'message': 'captcha failed'}

            email = sec.decryptAsymmetric(args['email'])
            password = sec.decryptAsymmetric(args['password'])
            fname = sec.decryptAsymmetric(args['first_name'])
            lname = sec.decryptAsymmetric(args['last_name'])
            country = sec.decryptAsymmetric(args['country'])
            promo_date = sec.decryptAsymmetric(args['promo_date'])

            if not util.is_valid_email(email):
                return {'status': 'failure', 'message': 'Email is invalid'}

            if promo_date != '':
                promo_date = datetime.fromisoformat(promo_date)
                if promo_date < datetime.now(timezone.utc):
                    return {'status': 'failure', 'message': 'Event date must be in the future'}
                
            status, message = db.create_user(email, password, fname, lname, country, promo_date)
            if status:
                return {'status': 'success', 'message': message}
            return {'status': 'failure', 'message': message}
        except Exception as e:
            print(e)
            return {'status': 'failure', 'message': 'Unknown server error. Please try again shortly.'}
  

заранее спасибо.

Комментарии:

1. Что ж, учитывая, что службы Linux не имеют вендетты в отношении информации базы данных, я бы начал с поиска в коде приложения, которое запускает служба.

2. я знаю. это не имеет смысла, но я несколько раз просматривал каждую строку. Я никогда не выполняю операторы truncate, но, похоже, это то, что происходит. и не во время выполнения конечных точек rest в приложении flask-restful, а конкретно при запуске / остановке / перезапуске службы

3. Я не очень хорошо знаком с uWSGI, однако я знаком с Linux, Python и MySQL. Это должно быть вызвано логикой инициализации. Возможно, попробуйте поделиться частью вашего кода из приложения, особенно частями запуска, которые взаимодействуют с базой данных.

4. добавлена информация о коде

5. я не знаю, что это было, но я начал с нуля на сервере debian 10, и теперь все хорошо