【问题标题】:Adding entry to SQLAlchemy database triggers `sqlite InterfaceError: Error binding parameter 0 - probably unsupported type`向 SQLAlchemy 数据库添加条目会触发`sqlite InterfaceError: Error binding parameter 0 - 可能是不受支持的类型`
【发布时间】:2021-05-30 14:22:24
【问题描述】:

我正在尝试使用以下 SQLAlchemy 模型文件将 Attempt 添加到 sqlite 数据库:

from app import db
from datetime import datetime

class User(db.Model):
    id = db.Column(db.Text, primary_key=True)
    name = db.Column(db.Text, nullable=False)
    email = db.Column(db.Text, nullable=False, unique=True)
    profile_pic = db.Column(db.Text, nullable=False)

    def __repr__(self):
        return '<User {}>'.format(self.name)

class Puzzle(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    width = db.Column(db.Integer, nullable=False)
    height = db.Column(db.Integer, nullable=False)
    letters = db.Column(db.String(225), nullable=False)

    def __repr__(self):
        return '<PuzzleNum {}>'.format(self.id)

class Attempt(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    puzzle_id = db.Column(db.Integer, db.ForeignKey('puzzle.id'))
    user_id = db.Column(db.Text, db.ForeignKey('user.id'))
    started = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    finished = db.Column(db.DateTime, index=True)

    def __repr__(self):
        return '<Attempt {}>'.format(self.started)

我使用flask shell 执行以下操作以获取UserPuzzle 对象(这表明我的其他加载的表工作正常):

>>> u = User.query.first()
>>> print(u.name)
Mark
>>> p = Puzzle.query.get(1)
>>> print(p.width)
10

我为我的Attempt 获得了所需的UserPuzzle 对象,但是当我运行以下命令时,它会触发一个sqlite InterfaceError

>>> a = Attempt(puzzle_id=p, user_id=u)
>>> db.session.add(a)
>>> db.session.commit()
Traceback (most recent call last):
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1276, in _execute_context
    self.dialect.do_execute(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\default.py", line 608, in do_execute
    cursor.execute(statement, parameters)
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\scoping.py", line 163, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\session.py", line 1046, in commit
    self.transaction.commit()
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\session.py", line 504, in commit
    self._prepare_impl()
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\session.py", line 483, in _prepare_impl
    self.session.flush()
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2540, in flush
    self._flush(objects)
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2682, in _flush
    transaction.rollback(_capture_exception=True)
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__
    compat.raise_(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2642, in _flush
    flush_context.execute()
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 422, in execute
    rec.execute(self)
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 586, in execute
    persistence.save_obj(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\persistence.py", line 239, in save_obj
    _emit_insert_statements(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\orm\persistence.py", line 1135, in _emit_insert_statements
    result = cached_connections[connection].execute(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1011, in execute
    return meth(self, multiparams, params)
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1124, in _execute_clauseelement
    ret = self._execute_context(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1316, in _execute_context
    self._handle_dbapi_exception(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1510, in _handle_dbapi_exception
    util.raise_(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1276, in _execute_context
    self.dialect.do_execute(
  File "a:\shell\weave2\venv\lib\site-packages\sqlalchemy\engine\default.py", line 608, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.InterfaceError: <unprintable InterfaceError object>

【问题讨论】:

    标签: python sqlite flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您的Attempt 类有许多属性,包括puzzle_iduser_id。两者都是Integer类型:

    class Attempt(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        puzzle_id = db.Column(db.Integer, db.ForeignKey('puzzle.id'))
        user_id = db.Column(db.Text, db.ForeignKey('user.id'))
        started = db.Column(db.DateTime, index=True, default=datetime.utcnow)
        finished = db.Column(db.DateTime, index=True)
    
        def __repr__(self):
            return '<Attempt {}>'.format(self.started)
    

    您查询您的 ORM 并检索 PuzzleUser 对象并将它们存储为 pu。如果您检查 p 是什么类型(例如,在终端上:type(p)),您会得到 &lt;PuzzleNum 1&gt; 例如(不是整数)

    所以这失败了:

    >>> a = Attempt(puzzle_id=p, user_id=u)
    >>> db.session.add(a)
    >>> db.session.commit
    

    puzzle_id 期待 Integer,但它得到了 Puzzle。将您的代码更改为:

    >>> a = Attempt(puzzle_id=p.id, user_id=u.id)
    >>> db.session.add(a)
    >>> db.session.commit
    

    将访问每个模型上的id 属性,这是一个Integer,因此不会违反您设置的规则。

    【讨论】:

    • 这正是问题所在。感谢您的清晰明了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2013-11-17
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多