Как избежать глобальных с помощью sqlalchemy

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

В общем объяснении sqlalchemy есть некоторые базовые настройки, в которых используются некоторые глобальные переменные. Но как избежать этих глобальных значений?

Это базовая настройка:

 import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

databaseName = 'fixedDBName.db'
engine = create_engine('sqlite:///'   databaseName, echo=True)
Base = declarative_base()
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

from sqlalchemy import Column, Integer, String
class User(declarative_base()):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

    def __repr__(self):
        return "<User(name='%s', fullname='%s', nickname='%s')>" % (
            self.name, self.fullname, self.nickname)

#Now you can create a session
Session = sessionmaker(bind=engine)
session = Session()
 

Теперь у меня возникают некоторые вопросы:

Могу ли я просто запустить соединение с базой данных, когда оно мне нужно, закрыть его впоследствии и запустить новое, когда оно мне понадобится снова?

Как вы используете его в своих проектах?

Вы упаковываете все, что имеет какое-то отношение к базе данных, в класс. Чтобы вы могли создать экземпляр этой функции? Вот так:

 class sqlcon():
    def __init__(self, databaseName):
        self.engine = create_engine('sqlite:///'   databaseName, echo=True)
        self.Session = sessionmaker(bind=self.engine)
        
    Base = declarative_base()
        
    class User(Base):
        __tablename__ = 'users'

        id = Column(Integer, primary_key=True)
        name = Column(String)
        fullname = Column(String)
        nickname = Column(String)

        def __repr__(self):
            return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                self.name, self.fullname, self.nickname)

    def createTables(self):
        Base.metadata.create_all(self.engine) #doesn´t work - Base is not Defined
        
    Base.metadata.create_all(self.engine) #doesn´t work - self is not Defined
 

Или
Вы упаковываете это внутри функции:

 def sqlcon(databaseName):
    
   engine = create_engine('sqlite:///'   databaseName, echo=True)
       
   Base = declarative_base()
       
   class User(Base):
       __tablename__ = 'users'

       id = Column(Integer, primary_key=True)
       name = Column(String)
       fullname = Column(String)
       nickname = Column(String)

       def __repr__(self):
           return "<User(name='%s', fullname='%s', nickname='%s')>" % (
               self.name, self.fullname, self.nickname)

   Base.metadata.create_all(engine) 

databaseName = "test_3.db"
alchemy = sqlcon(databaseName)
 

Но тогда как создать сеанс и как получить доступ к классу User?

Здесь мне нужен толчок в правильном направлении :/

Ответ №1:

Ответ довольно прост: база просто остается глобальной!

Во всех примерах на github вы найдете это таким образом.

в моем случае это было бы:

 import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
        __tablename__ = 'users'

        id = Column(Integer, primary_key=True)
        name = Column(String)
        fullname = Column(String)
        nickname = Column(String)

        def __repr__(self):
            return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                self.name, self.fullname, self.nickname)


if __name__ == "__main__":
    engine = create_engine("sqlite://")
    Base.metadata.create_all(engine)

    session = Session(engine)