#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, и теперь все хорошо