SqlAlchemy InterfaceError: параметр привязки ошибки 1 - вероятно, неподдерживаемый тип - PullRequest
0 голосов
/ 27 мая 2020

Я застрял на этом и не уверен, в чем проблема. У меня много отношений между пользователем и адресом. Я пытаюсь создать страницу, которая отображает все адреса пользователя, и пользователи могут быть перенаправлены на другую страницу для редактирования своей адресной информации. У меня есть два маршрута для этого: пользовательский маршрут отображает только адреса и предоставляет address_id для edit_address, который занимается обновлением информации.

Я все время получаю эту ошибку:

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 1 - probably unsupported type.
[SQL: UPDATE addresses SET updated_at=?, address=?, country=?, city=?, post_code=? WHERE addresses.id = ?]
[parameters: ('2020-05-27 19:39:33.594937', ('testing',), ('gb',), ('london',), ('lo346bd',), 1)]
(Background on this error at: http://sqlalche.me/e/rvf5)

Мои модели:

class TimestampMixin(object):
    created_at = db.Column(db.DateTime, nullable=False,
                           default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, onupdate=datetime.utcnow)

user_addresses = db.Table('user_addresses',
                          db.Column("user_id", db.Integer, db.ForeignKey(
                              "users.id")),
                          db.Column("address_id", db.Integer, db.ForeignKey("addresses.id")))

class User(db.Model, TimestampMixin, UserMixin):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    (...)
    # relationships (many to many)
    address = db.relationship("Address", secondary="user_addresses", backref="user", lazy="dynamic")

    def __repr__(self):
        return f"User('{self.username}')"

class Address(db.Model, TimestampMixin):
    __tablename__ = "addresses"

    id = db.Column(db.Integer, primary_key=True)
    address = db.Column(db.String(200), nullable=False)
    country = db.Column(db.String(100), nullable=False)
    city = db.Column(db.String(100), nullable=False)
    post_code = db.Column(db.String(100), nullable=False)

    def __repr__(self):
        return f"Address('{self.id}', '{self.address}', '{self.country}', '{self.post_code}')"

Мой шаблон:

<div class="container custom-bg my-4">
  <form method="POST" enctype="multipart/form-data" class="py-4">
    {{form.csrf_token()}}
    <div class="form-group col-12">
      {{render_field(form.address , class="form-control",placeholder="Enter your street address")}}
      {% for error in form.errors.address %}
      <div class="text-danger">{{error}}</div>
      {% endfor %}
    </div>
    <div class="form-group col-12">
      {{render_field(form.city , class="form-control",placeholder="Enter your city")}}
      {% for error in form.errors.city %}
      <div class="text-danger">{{error}}</div>
      {% endfor %}
    </div>
    <div class="form-group col-12">
      {{render_field(form.country , class="form-control",placeholder="Enter your country")}}
      {% for error in form.errors.country %}
      <div class="text-danger">{{error}}</div>
      {% endfor %}
    </div>
    <div class="form-group col-12">
      {{render_field(form.post_code , class="form-control",placeholder="Enter your post code")}}
      {% for error in form.errors.post_code %}
      <div class="text-danger">{{error}}</div>
      {% endfor %}
    </div>
    <div class="form-row justify-content-center">
      {{render_field(form.submit, class="btn btn-block btn-secondary")}}
    </div>

  </form>
</div>

Мое мнение

@ app.route("/profile/settings/edit_address/<address_id>", methods=["POST", "GET"])
@ login_required
def edit_address(address_id):

    addresses = Address.query.filter_by(id=address_id).first()
    form = UpdateAddressForm(obj=addresses)
    form.populate_obj(addresses)

    if form.validate_on_submit():
        # Update address
        addresses.address = form.address.data.lower(),
        addresses.city = form.city.data.lower(),
        addresses.post_code = form.post_code.data.lower(),
        addresses.country = form.country.data.lower(),

        db.session.commit()

        flash("You have updated your address!", "success")
        return redirect(url_for("user_settings"))

    return render_template("edit_address.html", title="Update Address", form=form)

1 Ответ

0 голосов
/ 28 мая 2020

Я смог исправить это после нескольких часов поиска. Тем не менее, я до сих пор не уверен, почему я получаю ошибку, поэтому, если бы кто-то мог уточнить, это было бы здорово. Я считаю, что это связано с отношениями «многие ко многим», потому что я использую тот же logi c для обновления данных с другими отношениями и никогда не сталкивался с этим. Я возвращал кортеж из данных в форме, который затем вызывал ошибку, поскольку ожидал возврата строки. Я не уверен, почему это произошло. В любом случае, я нашел этот вопрос , который помог мне адаптировать мою функцию просмотра, и теперь он работает.

@ app.route("/profile/settings/edit_address/<address_id>", methods=["POST", "GET"])
@ login_required
def edit_address(address_id):

address_to_update = Address.query.get(address_id)
form = AddressForm(obj=address_to_update)

if form.validate_on_submit():
    # Update address
    form.populate_obj(address_to_update)
    db.session.commit()

    flash("You have updated your address!", "success")
    return redirect(url_for("user_settings"))

return render_template("edit_address.html", title="Update Address", form=form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...