当前位置: 首页 > 面试题库 >

SQLAlchemy继承不起作用

潘弘壮
2023-03-14
问题内容

我正在使用Flask和SQLAlchemy。我使用了自己的抽象基类和继承。当我尝试在python shell中使用模型时,出现以下错误:

>>> from schedule.models import Task
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/teelf/projects/schedule/server/schedule/models.py", line 14, in <module>
    class User(Base):
  File "/home/teelf/projects/schedule/server/venv/lib/python3.4/site-packages/flask_sqlalchemy/__init__.py", line 536, in __init__
    DeclarativeMeta.__init__(self, name, bases, d)
  File "/home/teelf/projects/schedule/server/venv/lib/python3.4/site-packages/sqlalchemy/ext/declarative/api.py", line 55, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File "/home/teelf/projects/schedule/server/venv/lib/python3.4/site-packages/sqlalchemy/ext/declarative/base.py", line 254, in _as_declarative
    **table_kw)
  File "/home/teelf/projects/schedule/server/venv/lib/python3.4/site-packages/sqlalchemy/sql/schema.py", line 393, in __new__
    "existing Table object." % key)
sqlalchemy.exc.InvalidRequestError: Table 'user' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns
 on an existing Table object.

我该如何解决?

码:

manage.py:

#!/usr/bin/env python

import os, sys

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from flask.ext.migrate import Migrate, MigrateCommand
from flask.ext.script import Manager

from server import create_app
from database import db


app = create_app("config")

migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command("db", MigrateCommand)

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

init.py:

from flask import Flask

from flask.ext.login import LoginManager

from database import db
from api import api
from server.schedule.controllers import mod_schedule


def create_app(config):
    # initialize Flask
    app = Flask(__name__)

    # load configuration file
    app.config.from_object(config)

    # initialize database
    db.init_app(app)

    api.init_app(app)

    # initialize flask-login
    login_manager = LoginManager(app)

    # register blueprints
    app.register_blueprint(mod_schedule)

    return app

database.py:

from flask.ext.sqlalchemy import SQLAlchemy


db = SQLAlchemy()

models.py:

from sqlalchemy.dialects.postgresql import UUID

from database import db


class Base(db.Model):
    __abstract__ = True

    id = db.Column(UUID, primary_key=True)


class User(Base):
    __tablename__ = "user"

    username = db.Column(db.String)
    password = db.Column(db.String)
    first_name = db.Column(db.String)
    last_name = db.Column(db.String)
    authenticated = db.Column(db.Boolean, default=False)

    def __init__(self, first_name, last_name, username):
        self.first_name = first_name
        self.last_name = last_name
        self.username = username

    def is_active(self):
        """ All users are active """
        return True

    def get_id(self):
        return self.username

    def is_authenticated(self):
        return self.authenticated

    def is_anonymous(self):
        """ Anonymous users are not supported"""
        return False

controllers.py:

from flask import Blueprint

from flask.ext.restful import reqparse, Resource

from api import api
from server.schedule.models import User


mod_schedule = Blueprint("schedule",  __name__, url_prefix="/schedule")


class Task(Resource):
    def put(self):
        pass

    def get(self):
        pass

    def delete(self):
        pass


api.add_resource(Task, "/tasks/<int:id>", endpoint="task")

问题答案:

尝试添加

 __table_args__ = {'extend_existing': True} 

在你的User类下__tablename__=



 类似资料:
  • 问题内容: 对于sqlalchemy下的继承,我有些困惑,以至于我什至不确定在这里应该使用哪种继承类型(单表,联接表,具体)。我有一个基类,其中包含一些在子类之间共享的信息,以及一些完全独立的数据。有时,我需要所有类的数据,有时只需要子类的数据。这是一个例子: 如何使用声明式将其转换为SQLAlchemy?那么,我将如何查询位于和的建筑物?或哪些居民楼只有一名居民? 问题答案: 选择如何表示继承主

  • 问题内容: 我已经为h2标签设置了一些样式(颜色,字体大小等),但是当我在其中放置“ A”标签时,样式就会作为链接。我的html: 因此,如您所见,我创建了“ no-decor”类。它应该继承h2的“ a”标签样式。 在Firefox上,一切都可以,但IE仍显示标记“ a”样式(带下划线的文本装饰和蓝色)。我知道,我可以为“ h2 a”设置某种样式,但是也许可以通过某种方式在IE7上强制CSS继承

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • src/main/resources/application.yml 来自Spring文档: 创建一个名为application.yml的文件并将其放在类路径的根目录中,还将snakeyaml添加到依赖项中(如果使用spring-boot-starter,Maven坐标org.yaml:snakeyaml已经包含在内)。 在这个问题上有人能帮我吗? pom.xml

  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方