मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जिसे SQLAlchemy मॉडल के भीतर सभी पंक्तियों को हटाने के लिए निर्धारित किया जा सकता है।

मैं इस कार्य को पूरा करने के लिए apscheduler का उपयोग करने का प्रयास कर रहा हूं। लेकिन मुझे एक त्रुटि मिलती रहती है जो कहती है:

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'flask_sqlalchemy.model.DefaultMeta' is not mapped; was a class (app.models.User) supplied where an instance was required?

क्या मैं कुछ भूल रहा हूँ?

ये रहा मेरा app/__init__.py:

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from config import Config

app = Flask(__name__)

db = SQLAlchemy()
login = LoginManager()

app.config.from_object(Config)
db.init_app(app)
login.init_app(app)
login.login_view = 'login'

from app import routes, models

और यहाँ मेरा manage.py है:

from apscheduler.schedulers.background import BackgroundScheduler
from app import app, db
from flask_migrate import Migrate
from flask_script import Manager
from app.models import User

manager = Manager(app)

migrate = Migrate(app, db)

def clear_data():
    db.session.delete(User)
    print("Deleted User table!")

@manager.command
def run():
    scheduler = BackgroundScheduler()
    scheduler.add_job(clear_data, trigger='interval', seconds=5)
    scheduler.start()
    app.run(debug=True)

if __name__ == '__main__':
    manager.run()

इसके अलावा, यहाँ मेरा मॉडल है:

from app import db, login
from datetime import datetime
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True, unique=True)
    api_token = db.Column(db.String(50), unique=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    todos = db.relationship('Todo', backref='owner', lazy='dynamic')

    def __repr__(self):
        return '<models.py {}>'.format(self.username)

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)


@login.user_loader
def load_user(id):
    return User.query.get(int(id))


class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Todo {}>'.format(self.body)
1
Keva161 3 फरवरी 2020, 15:23

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि आपकी त्रुटि से संकेत मिलता है, यह किसी वस्तु के उदाहरणों की अपेक्षा कर रहा है, और आपने इसके बजाय इसे एक वर्ग पारित किया है। मुझे लगता है कि समस्या clear_data फ़ंक्शन में पहली पंक्ति है:

db.session.delete(User)

यह उपयोगकर्ता रिकॉर्ड को हटाने के लिए एक उदाहरण की उम्मीद कर रहा था, और यह नहीं जानता कि केवल मॉडल का उपयोग करके पूरी तालिका को कैसे हटाया जाए।

इस उत्तर को देखें कि कैसे तालिका में सभी पंक्तियों को हटाने के लिए। ऐसा करने के कुछ तरीके हैं, लेकिन यह आपके लिए कम से कम परिवर्तन हो सकता है:

db.session.query(User).delete()

इस मामले में आप SELECTउपयोगकर्ता मैप्स तालिका में सभी रिकॉर्ड्स को शामिल करने, फिर उन्हें हटाने का चरण जोड़ रहे हैं।

पीएस .: जैसा कि लिंक किए गए उत्तर में बताया गया है, आपको अपना सत्र .commit() करना होगा, अन्यथा यह टिकेगा नहीं, और कनेक्शन बंद करने के बाद रोलबैक हो जाएगा।

db.session.commit()
1
Jon 3 फरवरी 2020, 17:13

सांकेतिक टुकड़ा:

db.session.query(model_name).delete() 
db.session.commit()
0
user3480223 3 फरवरी 2020, 17:19