Реализация insert ignore в Sqlalchemy orm

329
26 ноября 2016, 20:20

Пытаюсь разобраться в 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.

READ ALSO
Подключение к базе данных mysql

Подключение к базе данных mysql

Доброго времени сутокСкажите, а можно ли этот метод, который подключается к БД с изменениями внести в ActionListener для кнопки

248
Непонятный запрос Yii2

Непонятный запрос Yii2

У меня постоянно показывает такой запрос

250
COUNT и total c двух колонок

COUNT и total c двух колонок

Задача - необходимо подсчитывать и выводить COUNT с двух колонок, в которых находятся числа от 1 до 30Имеем следующий код

246
Что такое &ldquo;федеративные таблицы&rdquo; в Mysql?

Что такое “федеративные таблицы” в Mysql?

Что такое "федеративные таблицы" в Mysql?

241