Мне трудно понять, как создавать модели на основе существующих таблиц БД с 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)