【发布时间】: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