簡體   English   中英

Flask 和 SQLAlchemy db.session.commit 不工作

[英]Flask and SQLAlchemy db.session.commit not working

當我將測試用戶添加到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)

--Edit ,包括 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)

我正在查看您的堆棧跟蹤(特別是最后一行),看起來您的表尚不存在。

在將新模型與數據庫一起使用之前,必須存在表和列。 好消息是SQLAlchemy可以為您做到這一點。

嘗試從程序中的任何位置調用以下命令:

# Creates the schema on the database
db.create_all()

完成后,請確保將其刪除!

理想情況下,您需要從命令行調用另一個文件,該文件會導入flask應用程序,然后運行此命令。 例如...

# 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 ,尤其是如果您的應用最終將在生產環境中使用時。

在最初的開發過程中,我使用的快速而骯臟的方法是刪除數據庫,如果更改太大,則再次創建它。

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) 錯誤綁定參數 4 - 可能是不受支持的類型。 [SQL: INSERT INTO todo (title, "desc", status, "user_Todo_id", file, created_date) VALUES (?, ?, ?, ?, ?, ?)] [參數: ('hj', 'j', 'active', None, <FileStorage: 'Screenshot from 2022-09-20 16-09-43.png' ('image/png')>, '2022-09-22 15:11:47.152')] (背景關於此錯誤: https://sqlalche.me/e/14/rvf5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM