当我将测试用户添加到User
表时,它会添加正常,即使我执行db.session.add(u)
也没问题,但是当我执行db.session.commit()
时它会抛出错误。
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Integer(120), unique=True)
email = db.Column(db.Integer(120), unique=True)
configkey = db.Column(db.Integer(200), unique=True)
dob = db.Column(db.DateTime)
country = db.Column(db.Integer(120))
friends = db.relationship('Friend', backref = 'friendof', lazy = 'dynamic')
def __repr__(self):
return '<User %r>' % (self.name)
class Friend(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Integer(120), unique=True)
email = db.Column(db.Integer(120), unique=True)
dob = db.Column(db.DateTime)
country = db.Column(db.Integer(120))
lastmessage = db.Column(db.Integer(1500))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self):
return '<FriendName %r>' % (self.name)
- 编辑,包括Python控制台中的错误消息:
>>> u = models.User(name="sd", email="e")
>>> db.session.add(u)
>>> db.session.commit()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/scoping.py", line 149, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 721, in commit
self.transaction.commit()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 354, in commit
self._prepare_impl()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 334, in _prepare_impl
self.session.flush()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1818, in flush
self._flush(objects)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1936, in _flush
transaction.rollback(_capture_exception=True)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py", line 58, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1900, in _flush
flush_context.execute()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 372, in execute
rec.execute(self)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 525, in execute
uow
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 64, in save_obj
table, insert)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 569, in _emit_insert_statements
execute(statement, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 662, in execute
params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 761, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 874, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception
exc_info
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 196, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 867, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 324, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (OperationalError) no such table: user u'INSERT INTO user (name, email, configkey, dob, country) VALUES (?, ?, ?, ?, ?)' ('sd'
, 'e', None, None, None)
答案 0 :(得分:3)
我正在查看你的堆栈跟踪(特别是最后一行),看起来好像你的表还没有存在。
在将新模型与数据库一起使用之前,必须存在表和列。好消息是SQLAlchemy可以为您做到这一点。
尝试从程序中的任何位置调用以下内容:
# Creates the schema on the database
db.create_all()
请务必在完成后将其删除!
理想情况下,您可以从命令行调用另一个文件来导入您的烧瓶应用程序,然后运行此命令。例如......
# Replace these with your main file and the name of your flask object
from myapp import app
# And this one with the name of your database file and object
from database import db
db.create_all()
print "Database ready!"
修改强>
db.create_all()
命令无法修改现有表格,类似的表格在您运行db.create_all()
后无法自动更改自己。但是,您可以创建一个新表,然后重新运行该函数并使其显示。
为了正确处理数据库的升级,我建议您查看Flask-Migrate,特别是如果您的应用最终将在生产环境中使用。
我在初始开发过程中使用的快速而脏的方法是删除数据库并在更改过大时再次创建它。