我正在尝试使用以下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
执行以下操作以获取User
和Puzzle
对象(这表明我的其他加载表工作正常):
>>> u = User.query.first()
>>> print(u.name)
Mark
>>> p = Puzzle.query.get(1)
>>> print(p.width)
10
我为我的Attempt
获得了所需的User
和Puzzle
对象,但当我运行以下命令时,它会触发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>
您的
Attempt
类有许多属性,包括puzzle_id
和user_id
。两者都属于Integer
类型:查询ORM并检索
Puzzle
和User
对象,并将它们存储为p
和u
。如果您检查了p
是什么类型(例如在终端:type(p)
),您将得到<PuzzleNum 1>
例如(不是整数)所以这是失败的:
puzzle_id
期望一个Integer
,但它得到一个Puzzle
。将代码更改为:将访问每个模型上的
id
属性,该属性是Integer
,因此不会违反您设置的规则相关问题 更多 >
编程相关推荐