При использовании sqlalchemy и context manager база данных не обновляется - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь обновить базу данных с помощью sqlalchemy, и мне нужно закрыть соединение / сеанс после выполнения сценария, чтобы использовать другое действие (удалить). Я переписываю часть предыдущего кода (не мой) и пробовал оба кода ниже, но, к сожалению, ничего нового не написано в базе данных. Это не обновляет базу данных новым значением, если я проверяю с помощью браузера базы данных или по коду (с функцией поиска).

Большое спасибо заранее

Первый код, который я попробовал:

import os
import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy import create_engine

import logging


logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

Base = declarative_base()
path1=os.getcwd()
datastore_file = os.path.join(
        path1,
        '../mydatabase.db'
    )
engine = sa.create_engine('sqlite:///{}'.format(datastore_file))
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

class ComponentValue(Base):
    __tablename__ = 'component_value'
    id = Column(Integer, primary_key=True)
    value = Column(String(64), nullable=False)

class ThingOne(object):
    def go(self, session,ct):
        (session.query(ComponentValue).filter(ComponentValue.value == ct.value)).first()
def lookup(ct):
    session = Session()
    try:
        val =ThingOne().go(session,ct) 
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()
    return val

def update(ct):
    session = Session()
    try:
        val = ThingOne().go(session,ct)

        if not val and len(ct.value.strip()):
            val = ComponentValue(value=ct.value)
            session.add(val)
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

Второй код, который я тоже пробовал:

import os
import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
import logging

logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

Base = declarative_base()

path1=os.getcwd()
datastore_file = os.path.join(
        path1,
        '../mydatabase.db'
    )

engine = sa.create_engine('sqlite:///{}'.format(datastore_file))
Base.metadata.create_all(engine)
Session = sessionmaker()
Session.configure(bind=engine)

class ComponentValue(Base):
    __tablename__ = 'component_value'
    id = Column(Integer, primary_key=True)
    value = Column(String(64), nullable=False)

@contextmanager
def session_scope():
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

class ThingOne(object):
    def go(self, session,ct):
        (session.query(ComponentValue).filter(ComponentValue.value == ct.value)).first()

def lookup(ct):
    with session_scope() as session:
        val =ThingOne().go(session,ct)        
        return val

def update(ct):
    with session_scope() as session:
        val = ThingOne().go(session,ct)
        if not val and len(ct.value.strip()):
            val = ComponentValue(value=ct.value)
            session.add(val)
        session.commit()
...