SQLAlchemy自动映射的烧瓶问题

时间:2020-02-05 14:49:53

标签: python mysql flask sqlalchemy automap

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

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

这是我的模型。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))

我已经尝试在类中指定主键列,但是在此之后,它找不到其他参数,就好像它希望我一个接一个地写它们一样,就像自动映射来自现有数据库无法正常工作

这是数据库声明:

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

1 个答案:

答案 0 :(得分:0)

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

在您的情况下,我将执行以下操作之一:

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

  2. 通过手工或通过诸如sqlacodegen之类的工具对数据库结构,键和关系进行反向工程到模型中 网址:https://pypi.org/project/sqlacodegen/

  3. 我的偏好:进行烧瓶迁移以提供更好的便利,并在代码中描述所有模型,键,关系,索引 网址:https://flask-migrate.readthedocs.io/en/latest/ 更好地,完整地描述您的模型,以及从烧瓶侧开始迁移,这是组织流程的明智方法,每次都能获得良好的结果。