Flask -SQLAlchemy - assertionError при попытке отразить существующую базу данных, когда существуют какие-либо отношения - PullRequest
1 голос
/ 07 апреля 2020

Мне трудно понять, как создавать модели на основе существующих таблиц БД с flask -sqlalchemy. Мне удалось сделать это с помощью автоматического автомата sqlalchemy, но я хочу использовать преимущества flask -sqlalchemy. Я много гуглил, но не смог найти ничего, что решило бы мою проблему. Самая интригующая часть заключается в том, что ошибка начинает возникать, как только я добавляю внешний ключ к любой таблице в БД. Я могу сгенерировать модели для всех таблиц успешно, при условии, что ни одна из них не имеет внешних ключей.

При попытке запустить приложение я получаю:

Traceback (most recent call last):
  File "C:\Users\Maciek\Documents\GitHub\stocker\run.py", line 2, in <module>
    from app import app, stock, products
  File "C:\Users\Maciek\Documents\GitHub\stocker\app\__init__.py", line 20, in <module>
    from app.models import Product
.
.
.
  File "C:\Users\Maciek\AppData\Local\Programs\Python\Python37\lib\site-packages\sqlalchemy\sql\schema.py", line 1952, in _link_to_col_by_colstring
assert self.constraint._referred_table is table
AssertionError

init .py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:password%@localhost:5432/stocker'

db = SQLAlchemy(app)
db.init_app(app)
db.reflect(app=app)
from app.models import Product
db.create_all()

models.py

from app import db

class Product(db.Model):
    __tablename__= db.Model.metadata.tables['Products']
    id = db.Column('Id', db.Integer, primary_key=True)
    name = db.Column('Name', db.String)
    categoryId = db.Column('CategoryId', db.Integer, db.ForeignKey('Categories.Id'))
    brandId = db.Column('BrandId', db.Integer, db.ForeignKey('Brands.Id'))
    unitId = db.Column('UnitId', db.Integer, db.ForeignKey('Units.Id'))
    brand = db.relationship("Brand", backref="products")
    category = db.relationship("Category", backref="products")
    unit = db.relationship("Unit", backref="products")

class Category(db.Model):
    __tablename__= db.Model.metadata.tables['Categories']
    id = db.Column('Id', db.Integer, primary_key=True)
    name = db.Column('Name', db.String)

class Brand(db.Model):
    __tablename__= db.Model.metadata.tables['Brands']
    id = db.Column('Id', db.Integer, primary_key=True)
    name = db.Column('Name', db.String)

class Unit(db.Model):
    __tablename__= db.Model.metadata.tables['Units']
    id = db.Column('Id', db.Integer, primary_key=True)
    name = db.Column('Name', db.String)

1 Ответ

0 голосов
/ 09 апреля 2020

Проблема решена путем переопределения моделей

from app import db

class ProductModel(db.Model):
    __table__= db.Model.metadata.tables['products']
    name = db.Model.metadata.tables['products'].columns['Name']
    brand = db.relationship("BrandModel", backref="products")
    category = db.relationship("CategoryModel", backref="products")
    unit = db.relationship("UnitModel", backref="products")

class UnitModel(db.Model):
    __table__= db.Model.metadata.tables['units']

class BrandModel(db.Model):
    __table__= db.Model.metadata.tables['brands']

class CategoryModel(db.Model):
    __table__= db.Model.metadata.tables['categories']
...