#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)