Форум сайта python.su
Добрый день.
Есть код, где описана БД и есть связь один ко многим (foreign key) и не ясное до конца поведения скрипта:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) class Role(db.Model): __tablename__= 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(45), unique=True, nullable=False) users = db.relationship('User', backref='role') def __repr__(self): return '<User %r>' % (self.name) class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(45), unique=True, nullable=False) # contents = db.relationship('Content', backref='author', lazy='dynamic') id_roles = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=False) db.create_all() q = Role(name='admins') db.session.add(q) db.session.commit() q = Role(name='users') db.session.add(q) db.session.commit() q = User(name='admin', id_roles=1) db.session.add(q) db.session.commit() q = User(name='user', id_roles=2) db.session.add(q) db.session.commit() q = User(name='user1', id_roles=222) db.session.add(q) db.session.commit() users = User.query.all() roles = Role.query.all() print('{}'.format('roles:')) for el in roles: print(el.id, el.name) print('{}'.format('users:')) for el in users: print(el.name, el.id_roles)
Отредактировано ivn (Март 27, 2017 16:17:56)
Офлайн
Я уже писал. Еще раз напишу. Так связи строить не принято. Возможно, если поставить там какой-нибудь флаг, который будет ругаться, оно и не даст записать.
Правильно: создать объект, получить объект для связи, связать. Не надо связывать по id…
Офлайн
Скорей всего дело в sqlite, наверное там не предусмотрены ограничения, на Postgresql же всё нормально, отображается ошибка:
sqlalchemy.exc.IntegrityError
IntegrityError: (psycopg2.IntegrityError) insert or update on table “equipment_ids” violates foreign key constraint “equipment_type_fkey”
DETAIL: Key (type)=(55555555) is not present in table “eq_types”.
Офлайн
Сделай как в этом туториале по Flask. Там показывают пример с SQLite и SQLAlchemy.
Офлайн