【问题标题】:Flask SQLAlchemy Heroku error: duplicate key value violates unique constraintFlask SQLAlchemy Heroku 错误:重复键值违反唯一约束
【发布时间】:2020-12-04 11:24:18
【问题描述】:

我有一个使用 SQLAlchemy 存储数据的 Flask 应用程序

我有一个模型AdminModel,如下图:

admin.py

class AdminModel(database.db.Model):
__tablename__ = "admins"

id = database.db.Column(database.db.Integer, primary_key=True)
email = database.db.Column(database.db.String(80))
username = database.db.Column(database.db.String(80))
password = database.db.Column(database.db.String(80))

def __init__(self, email, username, password):
    self.email = email
    self.username = username
    self.password = password

...

def insert(self):
    admin = self.find_by_username(self.username)
    if admin is None:
        # Hash the password
        self.password = utils.hash(self.password)
        # Add to DB
        database.db.session.add(self)
        database.db.session.commit()
        return True

    return False

初始化.py:

def create_default_admin():
    keys = settings.TwitterSettings.get_instance().super_admin # returns ["adminemail", "adminusername", "adminpassword"]
    admin = admin_mod.AdminModel(keys[0], keys[1], keys[2])
    admin.insert()


def create_app():
    # Create a Flask Application
    app = Flask(
        __name__,
        template_folder="templates",
        static_folder="static",
        instance_relative_config=True,
    )

    # Register blueprints
    app.register_blueprint(admin.admin, url_prefix="/admin")
    app.register_blueprint(live.live, url_prefix="/web")
    app.register_blueprint(api.api_bp, url_prefix="/api")

    # Flask configurations
    # app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///databases/fortweets.db"
    app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get(
        "DATABASE_URL", f"sqlite:///databases/fortweets.db"
    )
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    app.config["PROPAGATE_EXCEPTIONS"] = True
    app.secret_key = settings.TwitterSettings.get_instance().jwt_secret_key

    # # SQLAlchemy configurations
    # database.db.app = app
    # database.db.init_app(app)
    # database.db.create_all()

    database.db.app = app
    database.db.init_app(app)
    database.db.create_all()

    return app


# Create the app
app = create_app()

# JWT Configurations
jwt = JWTManager(app)

# Socket IO
socketio = SocketIO(app, cors_allowed_origins="*")

# Creates default admins and insert in db
create_default_admin()

...


# Start the app
if __name__ == "__main__":
    socketio.run(app, host="0.0.0.0")

当我在笔记本电脑上本地运行这个应用程序时,它运行良好。

当我在 Heroku 上运行它时(在 Heroku 中使用 postgres 数据库插件),我在日志中收到以下错误:

2020-12-04T11:04:57.005331+00:00 app[web.1]: sqlalchemy.exc.IntegrityError: 

(psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "pg_type_typname_nsp_index"
2020-12-04T11:04:57.005331+00:00 app[web.1]: DETAIL:  Key (typname, typnamespace)=(admins_id_seq, 2200) already exists.
2020-12-04T11:04:57.005331+00:00 app[web.1]:
2020-12-04T11:04:57.005331+00:00 app[web.1]: [SQL:
2020-12-04T11:04:57.005332+00:00 app[web.1]: CREATE TABLE admins (
2020-12-04T11:04:57.005332+00:00 app[web.1]: id SERIAL NOT NULL,
2020-12-04T11:04:57.005332+00:00 app[web.1]: email VARCHAR(80),
2020-12-04T11:04:57.005332+00:00 app[web.1]: username VARCHAR(80),
2020-12-04T11:04:57.005333+00:00 app[web.1]: password VARCHAR(80),
2020-12-04T11:04:57.005333+00:00 app[web.1]: PRIMARY KEY (id)
2020-12-04T11:04:57.005333+00:00 app[web.1]: )
2020-12-04T11:04:57.005334+00:00 app[web.1]:
2020-12-04T11:04:57.005334+00:00 app[web.1]: ]

谁能告诉我我做错了什么

为什么它在本地使用 sqlite3 而不是 Heroku Postgresql?

【问题讨论】:

    标签: postgresql heroku flask-sqlalchemy


    【解决方案1】:

    搜索了几个小时后,我改用 UWSGI 而不是 gunicorn 并且成功了。

    如果有人知道为什么 gunicorn 不能为此工作,请告诉我。

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题。好吧,解决这个问题的简单方法是通过以下命令重新启动 Heroku dynos:

      heroku restart
      

      这重新启动了测功机并创建了表格而没有任何错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-15
        • 2016-07-27
        • 2011-10-17
        • 2012-03-03
        • 2018-08-26
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多