在sqlalchemy中的不同模块之间访问相同的db.session

the*_*hey 3 python api session sqlalchemy crud

我是sqlalchemy的新手,正在尝试弄清楚如何使事情更清洁和连接。

我创建了一个/ model base.py文档,在其中创建了一个会话并在表中(以及关系等)建立了所有实体。我想创建另一个模块,在其中我可以对base.py中的实体(表)进行CRUD操作。该文件称为object.py,具有BaseAPI(object)类,并且具有不同的功能“创建”,“读取”,“更新”和“删除”。我想确保我连接到object.py中的表(base.py)并在实体User上进行操作。在这种情况下,实体(表)为“用户”。

这就是我在API object.py doc中所拥有的:

#!/usr/bin/env python

from sqlalchemy import create_engine
from sqlalchemy.orm import relationship, backref, sessionmaker
from datetime import datetime, timedelta
import notssdb.model
from base import User #importing from the module base.py -- doesn't work

engine = create_engine('sqlite:///./notssdb.db', echo=True) #in-memory sql engine 

# create a Session
Session = sessionmaker(bind=engine)


class BaseAPI(object):
#    DBSession = scoped_session(sessionmaker(engine))
#    users = DBSession.query(User).all()

    def __init__ (self):
       session = Session()


# CREATE USER 

    def create_user(self, username, password, fullname):
        new_user = User(username, password, fullname)
        self.session.commit(new_user)
        print(username, password, fullname)
Run Code Online (Sandbox Code Playgroud)

我要导入太多东西吗?我是否需要导入所有sqlalchemy工具?我在BaseAPI类下的初始化构造函数是否需要实例化数据库会话?

gsb*_*eng 5

1.我要进口太多东西吗?我是否需要导入所有sqlalchemy工具?

Sqlalchemy没有它自己的编码样式,您必须遵循Python编码样式。如果您不使用任何模块,则没有导入它的意义。

我看不到已经使用过,from sqlalchemy.orm import relationship, backref并且应该在定义时使用它models,因此您不需要导入这些模块。

2.我在BaseAPI类下的init构造函数是否需要实例化数据库会话?

session在BaseAPI中没有硬性规定可以启动,甚至可以像这样编写程序。

#!/usr/bin/env python

from sqlalchemy import create_engine
from sqlalchemy.orm import relationship, backref, sessionmaker
from datetime import datetime, timedelta
import notssdb.model
from base import User #importing from the module base.py -- doesn't work

engine = create_engine('sqlite:///./notssdb.db', echo=True) #in-memory sql engine 

# create a Session
Session = sessionmaker(bind=engine)
session = Session()


class BaseAPI(object):

# CREATE USER 

    def create_user(self, username, password, fullname):
        new_user = User(username, password, fullname)
        session.commit(new_user)
        print(username, password, fullname)
Run Code Online (Sandbox Code Playgroud)

但是,与您的connection一代人打成一片并不是好习惯user manager,我建议您遵循这种方式。

注意: 这只是一个示例代码,我没有执行,您只需要遵循此structure代码即可。

首先创建单独的模块进行连接管理,可能connection_manager.py与以下内容类似。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///./notssdb.db', echo=True)

# create a Session
Session = sessionmaker(bind=engine)

class SessionManager(object):
    def __init__(self):
        self.session = Session()
Run Code Online (Sandbox Code Playgroud)

然后在此处创建您的文件user_manger.py并将其导入SessionManager

from base import User # this is your User model
from connection_manager import SessionManager

class UserManager(SessionManager):

    def create_user(self, username, password, fullname):
        new_user = User(username, password, fullname)
        self.session.commit(new_user)
        print(username, password, fullname)

    def delete_user(self, *args):
        pass # your code
Run Code Online (Sandbox Code Playgroud)

这样,您可以使代码更整洁。

  • 为什么将“Session = sessionmaker(bind=engine)”放在“SessionManager”类之外? (3认同)