Как использовать сессию с ядром sqlalchemy в python? - PullRequest
0 голосов
/ 28 июня 2019

Я использую оба ядра sqlalchemy и sqlalchemy orm, потому что хочу динамически создавать таблицы. Вот мой код:

from sqlalchemy import create_engine,event,exc,MetaData,Table
from sqlalchemy.orm import sessionmaker,scoped_session,mapper
from sqlalchemy.ext.declarative import declarative_base

MYSQL_DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USERNAME,MYSQL_PASSWORD,MYSQL_HOST,MYSQL_PORT,MYSQL_DATABASE)

Base = declarative_base()

engine = create_engine(MYSQL_DB_URL,pool_size=300,max_overflow=0,pool_recycle=1800,pool_pre_ping=True)

DBSession = sessionmaker(bind=engine)

db_session = scoped_session(DBSession)

#orm table
class User(Base):
    ...

class CustomTable():

    def __init__(self,table_name,metadata=metadata):
        self.table = Table(table_name,metadata,
            Column('id',Integer,primary_key=True,autoincrement=True),
            extend_existing=True,
            )
        self.initial(engine=engine)

    def initial(self,engine=engine):
        #self.drop_table(engine)
        self.create_table(engine=engine)

    def create_table(self,engine=engine):
        self.table.create(engine,checkfirst=True)

    def drop_table(self,engine=engine):
        self.table.drop(engine,checkfirst=True)

if __name__ == "__main__"
    session = db_session()
    #some CRUD with session
    ...
    session.add()
    ...
    inert_data_list=[{"id":1},{"id",2}]
    #create table dynamically
    locked_t_detail_obj = CustomTable(table_name=locked_table_name)
    #insert data
    ins = locked_t_detail_obj.table.insert()
    #this line can't rollback
    session.execute(ins,inert_data_list)

    session.commit()


Я хочу откатить все изменения при возникновении исключения. Что я должен делать? Или есть другой способ решить проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...