Ошибки программирования при создании таблиц БД в Postgresql с помощью SQLAlchemy - PullRequest
0 голосов
/ 18 февраля 2019

У меня проблема с созданием таблиц с помощью SQLAlchemy в PostgreSQL.

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) нет уникального ограничения, соответствующего данным ключам для ссылочной таблицы "person". [SQL: '\ nCREATE TABLE signer (\ n \)tid INTEGER NOT NULL, \ n \ tdecree VARCHAR (120), \ n \ tjob_title VARCHAR (120), \ n \ tdate_duty_start TIMESTAMP БЕЗ ВРЕМЕННОЙ ЗОНЫ, \ n \ tdate_duty_end TIMESTAMP БЕЗ ВРЕМЕННОЙ ЗОНЫ, \ INT \ NER NERn \ tcompany_id INTEGER NOT NULL, \ n \ tsigner_id INTEGER NOT NULL, \ n \ tcompany_ids INTEGER, \ n \ tperson_ids INTEGER, \ n \ tПЕРВИЧНЫЙ КЛЮЧ (id, signer_id), \ n \ tFOREIGN KEY (person_id) ЛИЧНЫЙ ИНД.), \ n \ tFOREIGN KEY (company_id) ССЫЛКИ на компанию (id), \ n \ tFOREIGN KEY (company_ids) ССЫЛКИ на компанию (company_id), \ n \ tFOREIGN KEY (person_ids) СПРАВОЧНИКИ person (person_id) \ n) \ n \ n'] (Справочная информация об этой ошибке: http://sqlalche.me/e/f405)

Я пытаюсь создать новую базу данных, поэтому удаление всех таблиц не решает проблему. Кроме того, я не могу понять, почему нет проблем с созданиемзависимостимежду таблицами компании и подписавшего, в то время как существует проблема с отношениями между персоной и подписавшим ....

Мои занятия выглядят следующим образом:

class Person(db.Model):
    __table_args__ = {'extend_existing': True} 
    def __init__ (self, *args, **kwargs):
        [[setattr(self, key, dict[key]) for key in dict if any(key == t for t in Person.__dict__)] for dict in args]

    person_id = db.Column(db.Integer, primary_key = True)
    first_name = db.Column(db.String(30), nullable=False)
    middle_name = db.Column(db.String(40), nullable=False)
    last_name = db.Column(db.String(60), nullable=False)
    email = db.Column(db.String(120))
    license = db.Column(db.String(120))
    address = db.Column(db.String(240))
    telephone = db.Column(db.String(30))

    #o2o
    user_id = db.Column(db.Integer, db.ForeignKey('usersd.user_id'))

    #o2m
    signers = db.relationship('Signer', backref='person_data', lazy='jioned')

    def __repr__(self):
        return f"{self.last_name.Capitalize} {self.first_name[0].Upper}. {self.middle_name[0].Upper}."

class Signer(db.Model):
    __table_args__ = {'extend_existing': True} 

    def __init__ (self, *args, **kwargs):
        [[setattr(self, key, dict[key]) for key in dict if any(key == t for t in Signer.__dict__)] for dict in args]

    signer_id = db.Column(db.Integer, primary_key = True)
    decree = db.Column(db.String(120))
    job_title = db.Column(db.String(120))
    date_duty_start = db.Column(db.DateTime)
    date_duty_end = db.Column(db.DateTime)
    #o2m

    company_ids = db.Column(db.Integer, db.ForeignKey('company.company_id'))
    person_ids = db.Column(db.Integer, db.ForeignKey('person.person_id'))
    #m2o

    def __repr__(self):
        return f"{self.job_title} at {self.company} according to {self.decree}."

class Company(db.Model):
    __table_args__ = {'extend_existing': True} 

    def __init__ (self, *args, **kwargs):
        [[setattr(self, key, dict[key]) for key in dict if any(key == t for t in Company.__dict__)] for dict in args]

    company_id = db.Column(db.Integer, primary_key = True)
    company_name = db.Column(db.String(60))
    full_title = db.Column(db.String(240))
    tin = db.Column(db.BigInteger)
    kpp = db.Column(db.Integer)
    ogrn = db.Column(db.BigInteger)
    email = db.Column(db.String(120))
    address = db.Column(db.String(240))
    telephone = db.Column(db.String(60))

    license_number = db.Column(db.String(40))
    license_date_issued = db.Column(db.DateTime) 
    license_category = db.Column(db.String(120))
    license_issued_by = db.Column(db.String(120))
    license_issued_by_tin = db.Column(db.BigInteger)
    license_issued_by_kpp = db.Column(db.Integer)
    license_issued_by_ogrn = db.Column(db.BigInteger)

    #o2m
    signers = db.relationship('Signer', backref='company', lazy='joined')


    def __repr__(self):
        return f"{self.company_name}"

----------------------
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
import sys
import locale
import datetime





app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:XXXXXXXXXXXXX@localhost/aosr_flask_0_1'
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'


------
from test_models import *
db.create_all()

Я думаю, что проблема возникла, потому что я былпытаясь избежать столбцов с именем «id» для каждого класса.Хотя я определил первичные ключи в каждом классе как person_id, signer_id, company_id и т. Д. В моей базе данных Postgres, в каждой таблице также есть столбцы первичного ключа "id".Согласно SQL, указанному в сообщении Error, SQL Alchemy пытается создать два ограничения для каждого случая ... что делает его не уникальным.

Поэтому мой вопрос сводится к тому, как заставить SQLAlchemy не создавать столбцы первичного ключа (ID)) самостоятельно, если не указано иное.

Я стараюсь избегать столбцов с именем ID в базе данных, чтобы потом было меньше проблем с использованием этих объектов в HTML.

1 Ответ

0 голосов
/ 19 февраля 2019

Насколько я понимаю, ваша проблема говорит о том, что вы не определили уникальную опцию для своего поля первичного ключа.Ваш person_id должен иметь уникальный = True.Это гарантирует, что в этом поле не будет повторяющихся идентификаторов.

person_id = db.Column(db.Integer, primary_key = True, unique=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...