Передача разных записей данных формы в одну и ту же строку в базе данных с помощью Python Flask и SQLAlchemy

#python #sqlite #flask-sqlalchemy #flask-wtforms

#python #sqlite #flask-sqlalchemy #flask-wtforms

Вопрос:

Я создал форму, которая принимает имя пользователя и его адрес электронной почты. Я получаю эти данные из формы и помещаю их в базу данных sqlite3 следующим образом:

  @app.route('/my_form', methods=["GET", "POST"])

def form_data():
    if request.method == "POST":
        user_name = request.form["name"]
        new_user = form_database(name=user_name)
        user_email = request.form["email"]
        new_user_email = form_database(email=user_email)
     try:
            db.session.add(new_user)
            db.session.add(new_user_email)
            db.session.commit()
            return redirect("/my_form")
  

Текущий результат: каждая запись данных записывается в новую строку:

 1|Jack||||||||||
2||svisto@hotmail.com|||||||||
  

Желаемый результат: каждая запись данных записывается в одну и ту же строку:

 1|Jack|svisto@hotmail.com|||||||||
  

Вопрос: Как я могу изменить код таким образом, чтобы получить желаемый результат?

Ответ №1:

Допустим, у вас есть класс User в вашей модели, подобный этому:

 from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):    
    __tablename__ = 'users'
    id = db.Column(db.Integer,
                   primary_key=True)
    username = db.Column(db.String(32),
                         index=False,
                         unique=True,
                         nullable=False)
    email = db.Column(db.String(64),
                      index=True,
                      unique=True,
                      nullable=False)
  

Затем вы можете сделать это в своем блоке try

 try:
    new_user = User(user_name=user_name,
                            email=email)
    db.session.add(new_user)
    db.session.commit()
             
  

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

1. Спасибо за ваше решение. Я рассмотрю это в образовательных целях и в качестве альтернативы.

Ответ №2:

Решение, которое я нашел:

Я слился:

 new_user = form_database(name=user_name) and new_user_email = form_database(email=user_email)
  

вместе так, чтобы код выглядел следующим образом:

 @app.route('/my_form', methods=["GET", "POST"])

def form_data():
    if request.method == "POST":
        user_name = request.form["name"]
        user_email = request.form["email"]
        new_user_details = form_database(name=user_name, email=user_email)#assigns 2 form inputs for both columns in the database model to the same variable
     try:
            db.session.add(new_user_details)#adds that variable to the database as one entry, hence in one row but different columns
            db.session.commit()