2016-11-20 19 views
6

Tôi có một bảng trong một cơ sở dữ liệu được khởi tạo và truy cập thông qua SQLAlchemy:SQLAlchemy OperationalError do Query-gọi autoflush

tôi thêm một kỷ lục để nó sử dụng Flask-SQLAlchemy như vậy:

... 
content = request.form['content'] 
date = datetime.today() 
post = Post(date, content) 
db.session.add(post) 
db.session.commit() 
... 

Hồ sơ này được thêm vào bảng phạt. Ngay sau khi mã được thực thi, tôi truy vấn bảng khác:

userID = session['userID'] 
posts = db.session.query(Post).filter_by(userID=userID).count() 

Tuy nhiên tôi nhận được một lỗi trong quá trình truy vấn:

OperationalError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (_mysql_exceptions.OperationalError) (1292, "Incorrect date value: '11/20' for column 'date' at row 1") [SQL: u'UPDATE posts SET date=%s WHERE posts.id = %s'] [parameters: (('11/20', 1L))]

Tại sao ngày của bài đang được cập nhật khi tôi đã xác định nó khi thêm bản ghi vào bảng? Ngoài ra, nguyên nhân của lỗi này có thể là gì? Cảm ơn.

Edit:

Đây là những gì mô hình bảng cũng giống như:

class Post(db.Model): 

    __tablename__ = 'posts' 

    id = db.Column(db.Integer, primary_key=True) 
    content = db.Column(db.String(500)) 
    date = db.Column(db.Date, nullable=False) 

    def __init__(self, id, content, date): 
     self.id = id 
     self.content = content 
     self.date = date 
+1

Fix định dạng của đoạn và cũng thêm mã cho 'nét Post' của. – rantanplan

+0

@rantanplan đã hoàn thành. –

+0

Pav Tôi đã xóa câu trả lời của tôi, bạn nói đúng nó không liên quan. Vấn đề là chúng ta phải thiếu một số chi tiết (một số mã nhiều hơn có thể?) Để có được để dưới cùng của điều này. Nếu tôi nghĩ ra bất kỳ ý tưởng nào khác, tôi sẽ đăng câu trả lời mới. – rantanplan

Trả lời

1

date = datetime.today() trả về một đối tượng datetime (Date and Time)

nhưng thuộc tính ngày của mô hình Post là một db.Date (ngày KHÔNG CÓ thời gian)

Hãy thử:

  • từ datetime ngày nhập

    ...

    content = Request.Form [ 'content']

    date = date.today() -> tiêm một đối tượng Date chứ không phải là một Datetime

hay:

  • lớp Post (db.Model): -> chỉnh sửa bài viết schema

    ...

    date = db.Column (db.TIMESTAMP, nullable = False)

-1

Lỗi này có thể gây ra từ truy vấn khác, ngay cả khi bạn giải quyết rằng ngoại lệ vẫn sẽ xảy ra nếu bạn không khôi phục lỗi phiên trước đó

Bạn có thể bắt ngoại lệ và giao dịch ngược lại ion

thường trong ứng dụng bình của tôi, tôi cam kết phiên cuối cùng của yêu cầu

@app_instance.after_request 
def after(response): 
    try: 
     # commit transaction 
     db.session.commit() 
    except Exception: 
     db.session.rollback() 
     raise 

    return response 
2

Stephane là đúng, bạn đang đi qua một loại sai với mô hình, hoặc vượt qua datetime.date đối tượng hoặc thay đổi định nghĩa của ngươi mâu.Đối với phần đầu tiên của câu hỏi, tôi khuyên bạn nên đọc nội dung nào đó về số sessions and flushing. Điều này quan trọng:

All changes to objects maintained by a Session are tracked - before the database is queried again or before the current transaction is committed, it flushes all pending changes to the database.

Vì vậy, bằng cách tạo đối tượng bài đăng và thêm đối tượng vào phiên, bạn chỉ thực hiện thay đổi đang chờ xử lý nhưng chưa có liên lạc nào với cơ sở dữ liệu. Điều đó xảy ra với flush(), bạn có thể gọi thủ công hoặc tự động, ví dụ, bằng cách gọi commit().

(btw. Bạn không cần phải tạo ra phương pháp init của riêng bạn cho các mô hình, xem http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#adding-and-updating-objects)

Các vấn đề liên quan