У меня проблема с созданием таблиц с помощью 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.