向SQLAlchemy数据库添加条目会触发`sqlite InterfaceError:Error绑定参数0可能不支持的类型`

2024-10-03 09:07:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用以下SQLAlchemy模型文件向sqlite数据库添加一个Attempt

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>

Tags: inpyselfexecutedbvenvsqlalchemylib
1条回答
网友
1楼 · 发布于 2024-10-03 09:07:30

您的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)),您将得到<PuzzleNum 1>例如(不是整数)

所以这是失败的:

>>> 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,因此不会违反您设置的规则

相关问题 更多 >