繁体   English   中英

SQLAlchemy 自动映射的 Flask 问题

[英]Flask issue with SQLAlchemy automap

我有一个自动映射来处理我的应用程序项目中的现有数据库。 当我使用 flask run 命令在我的电脑上启动它时,它工作正常,并将数据保存在数据库中。 现在我正在尝试将我的应用程序放在 debian 服务器上,当我使用 gunicorn 运行该应用程序时,它返回此错误:

sqlalchemy.exc.ArgumentError: Mapper mapped class Applications->applications could not assemble any primary key columns for mapped table 'applications'.

这是我的models.py:

from flask_login import UserMixin
from sqlalchemy import Column, Date, Integer, String, create_engine
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.automap import automap_base

Base = automap_base()

class User(UserMixin, Base, db.Model):
    __tablename__ = "accounts"

    def __repr__(self):
        return "User {}".format(self.acc_username)

    def get_id(self):
           return (self.acc_id)

class Char(Base, db.Model):
    __tablename__ = "characters"

    def __repr__(self):
        return self.char_name.replace('_',' ')

class Applications(Base, db.Model):
    __tablename__="applications"

    def __repr__(self):
        return "Application ".format(self.id)

Base.prepare(db.engine, reflect=True)

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

我已经尝试在类中指定主键列,但是在此之后,它没有找到其他参数,所以就好像要我一个一个地写它们,就像现有数据库中的automap没有工作

这是数据库声明:

db = SQLAlchemy(app)

数据库配置:

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'app.db')

数据库网址:

DATABASE_URL=mysql+pymysql://root:xxxx@localhost:3306/xxxx

如果没有在代码库中声明您的列、键和索引,则可能会导致这种情况,例如,如果您从 SQLLite 切换到 MySQL 或从本地切换到服务器(至少从我以前的经验来看)

在你的情况下,我会做以下事情之一:

  1. 应用更好的自动映射功能,如文档所述(可能带有反射): https : //docs.sqlalchemy.org/en/13/orm/extensions/automap.html

  2. 手动或通过一些工具(如 sqlacodegen url: https ://pypi.org/project/sqlacodegen/)将数据库结构、键和关系逆向工程到模型中

  3. 我的偏好:使用flask migrate 以获得更好的便利,并在代码url 中描述您的所有模型、键、关系、索引: https: //flask-migrate.readthedocs.io/en/latest/ 更好地完整描述您的模型为以及从烧瓶端开始迁移,这是编排并每次都能获得良好结果的明智方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM