gpt4 book ai didi

python - Flask-SQLAlchemy 多对多关系 : How to insert data

转载 作者:行者123 更新时间:2023-12-01 21:52:13 24 4
gpt4 key购买 nike

我在 Flask-Sqlalchemy 模型中创建了多对多关系。但是,我似乎不太了解如何填充我的数据库。你能告诉我我应该如何编写代码来正确填充我的数据库吗?

这是我的模型:

company_contact = db.Table('company_contact', db.Model.metadata,
db.Column('company_id', Integer, ForeignKey('company.id')),
db.Column('contact_id', Integer, ForeignKey('contact.id'))
)

class Company(db.Model):
__tablename__ = 'company'

id = db.Column(db.Integer, primary_key=True, autoincrement=True)
contacts = db.relationship('Contact', secondary=company_contact, back_populates="companies")
company_name = db.Column(db.String(100))

def __repr__(self):
return '<Company {}{}>'.format(self.contacts, self.company_name)


class Contact(db.Model):
__tablename__ = 'contact'

id = db.Column(db.Integer, primary_key=True, autoincrement=True)
last_name = db.Column(db.String(255))
first_name = db.Column(db.String(255))
job_position = db.Column(db.String(255))
companies = db.relationship('Company', secondary=company_contact, back_populates="contacts")
contact_status = db.Column(db.Enum('Client', 'Prospect', 'Churner', 'Prestataire', 'Reperage',
name='contact_status'))
start_date = db.Column(db.DateTime, server_default=db.func.now())
stop_date = db.Column(db.DateTime, default=None)

def __repr__(self):
return '<Contact {}>'.format(self.last_name, self.first_name, self.job_position, self.companys,
self.contact_status, self.start_date, self.stop_date)

我想做的是添加两个具有相同公司名称的联系人。添加第一个不是问题,一切正常。但是,对于第二个联系人,当我添加此代码时出现问题。

com = Company(company_name='bla')
con = Contact(last_name='Blabla', first_name='Jeff', job_position='Resp Marketing',contact_status='Client')
con.companies.append(com)
db.session.add(con)
db.session.commit()

sqlalchemy.exc.IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "company_company_name_key" DETAIL: Key (company_name)=(bla) already exists.

我不知道如何写它来允许同一家公司有两个联系人,也允许两个公司有相同的联系人。

非常感谢您的帮助。

最佳答案

所以:你的数据库是空的。你初始化数据库,用 sqlalchemy 创建表......(不记得命令)

然后你这样做:

com = Company(company_name='bla')
con = Contact(last_name='Blabla', first_name='Jeff', job_position='Resp Marketing',contact_status='Client')
con.companies.append(com)
db.session.add(con)
db.session.commit()

然后你这样做:

#can't remember how to get just one row, is it first instaid of all ? sorry
com_already_created = Company().query.all()[0]

con = Contact(last_name='Blabla2', first_name='Jeff2', job_position='Resp Marketing',contact_status='Client')

con.companies.append(com_already_created)
#or
com_already_created.contacts.append(con)

db.session.add(con)
db.session.commit()

你的问题是你正在创建一个元素添加到你的表 Company 已经存在(我认为你从“Company”模型实现中的“company_name”中删除了 PK 或 unique)

还有:检查你的 __repr__,使用 python3.7 f"string"示例:

    def __repr__(self):
return '<Contact {}>'.format(self.last_name, self.first_name,
self.job_position, self.companys, self.contact_status, self.start_date,
self.stop_date)

应该是:

def __repr__(self):
return f'<Contact PK:{self.id}, lst_nm:{self.last_name},
frst_nm:{self.first_name}, jb_pos:{self.job_position>},
cnt_comp:{len(self.companys)}'

#(add more if you want but its getting messy)

关于python - Flask-SQLAlchemy 多对多关系 : How to insert data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59073723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com