Пытаюсь разобраться в sqlalchemy, подскажите, пожалуйста, как реализовать insert ignore при использовании sqlalchemy orm. Имеем три таблицы вида:
import mysql.connector
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Table, Column, Integer, String, Text, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
class Article(Base):
__tablename__='articles'
id = Column(Integer,primary_key=True, nullable=False)
title = Column(String(200), unique=True, nullable=False)
tags = relationship("Tag", secondary="articles_tags", back_populates = "articles", lazy="dynamic")
def __repr__(self):
return "<Article(title='%s')>" % (self.title)
class Tag(Base):
__tablename__='tags'
id = Column(Integer,primary_key=True, nullable=False)
name = Column(String(20), unique=True, nullable=False)
articles = relationship("Article", secondary="articles_tags", back_populates = "tags", lazy='dynamic')
def __repr__(self):
return "<Tag(name='%s')>" % (self.name)
class Articles_Tags(Base):
__tablename__='articles_tags'
article_id = Column(Integer, ForeignKey('articles.id'), primary_key=True)
tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=True)
engine = create_engine('mysql+mysqlconnector://root:XXXXX@localhost/news_orm', echo = True)
Base.metadata.create_all(bind = engine)
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
Далее заполняем данными:
Python 3.4.3 (default, Sep 14 2016, 12:46:27)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from news2 import *
>>> a=Article(title="An article")
>>> t=Tag(name="News")
>>> a.tags.append(t)
>>> session.add(a)
>>> session.commit()
Все ок, все три таблицы заполнились данными
>>> a1=Article(title="Another article")
>>> a1.tags.append(t)
>>> session.add(a1)
>>> session.commit()
Все ок, все три таблицы заполнились данными
>>> a2=Article(title="One more article")
>>> t2=Tag(name="News")
>>> a2.tags.append(t2)
>>> session.add(a2)
>>> session.commit()
Вылезает IntegrityError
------------------
sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry 'News' for key 'name' [SQL: 'INSERT INTO tags (name) VALUES (%(name)s)'] [parameters: {'name': 'News'}]
>>>
То есть все замечательно работает то тех пор пока аппендим к статьям уникальные теги, если же пытаемся аппендить тег, уже имеющийся в базе, вылезает integrity error. Отсюда вопрос: как в Sqlalchemy orm реализовать INSERT IGNORE чтобы если тэг неуникальный и уже имеется в таблице tags то он бы просто игнорировался, но вставлялся при этом в articles_tags.
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Доброго времени сутокСкажите, а можно ли этот метод, который подключается к БД с изменениями внести в ActionListener для кнопки
Задача - необходимо подсчитывать и выводить COUNT с двух колонок, в которых находятся числа от 1 до 30Имеем следующий код