【问题标题】:SqlAlchemy InterfaceError: Error binding parameter 1 - probably unsupported typeSqlAlchemy InterfaceError:错误绑定参数 1 - 可能不受支持的类型
【发布时间】:2020-05-29 14:57:49
【问题描述】:

我被困在这个问题上,我不确定是什么问题。我在用户和地址之间有多对多的关系。我正在尝试创建一个页面来显示用户的所有地址,并且可以将用户重定向到另一个页面以编辑他们的地址信息。为此,我有两条路线,用户路线仅显示地址,并将 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)

【问题讨论】:

  • 这是错误信息的范围还是还有什么?
  • 我一直坚持这一点,我发现了类似的问题,但没有一个适用于我的问题,我尝试了几件事但没有任何效果,我相信我得到一个元组表单数据,但我不知道为什么。
  • 从堆栈跟踪中,您的输入之一似乎是错误的类型。您是否尝试过检查输入类型以确保它符合您的模型?如果这仍然不能解决它,并且你有一个可重现的项目的 git。我可以克隆并进一步调试@LucasGomes
  • 每行末尾的逗号创建元组,应该删除它们。

标签: python flask sqlalchemy jinja2


【解决方案1】:

在搜索了几个小时后,我能够修复它。但是,我仍然不确定为什么我会收到错误,所以如果有人能澄清它会很棒。我相信这与多对多关系有关,因为我使用相同的逻辑来更新具有其他关系的数据,但从未遇到过这种情况。我从表单中的数据中获取了一个元组,然后导致错误,因为它期望返回一个字符串。我不确定为什么会这样。无论如何,我发现 this question 帮助我调整了我的视图功能,现在它可以工作了。

@ 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)

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多