Найти - Пользователи
Полная версия: Flask-SQLAlchemy не ясное поведения при работе с sqlite
Начало » Web » Flask-SQLAlchemy не ясное поведения при работе с sqlite
1
ivn
Добрый день.
Есть код, где описана БД и есть связь один ко многим (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)

вот этот код, который делает то чего не могу понять, почему такое происходит:
id_roles=222
почему это проходит??
т.е. эти данные записываются в БД, а ведь должна возвращаться ошибка.
4kpt_V
Я уже писал. Еще раз напишу. Так связи строить не принято. Возможно, если поставить там какой-нибудь флаг, который будет ругаться, оно и не даст записать.
Правильно: создать объект, получить объект для связи, связать. Не надо связывать по id…
plusplus
Скорей всего дело в 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
Сделай как в этом туториале по Flask. Там показывают пример с SQLite и SQLAlchemy.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB