【问题标题】:Accessing same db.session across different modules in sqlalchemy在 sqlalchemy 中跨不同模块访问相同的 db.session
【发布时间】:2015-07-28 16:04:53
【问题描述】:

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

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

这是我在 API object.py 文档中的内容:

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

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

【问题讨论】:

    标签: python api session sqlalchemy crud


    【解决方案1】:

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

    Sqlalchemy 没有自己的编码风格,你必须关注Python coding style。如果你不使用任何模块,那么导入它是没有意义的。

    我没有看到这个 from sqlalchemy.orm import relationship, backref 被使用过,这应该在定义 models 时使用,因此你不需要导入这些模块。

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

    没有硬性规定你必须在 BaseAPI 中发起 session,你甚至可以这样编写程序..

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

    但是将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()
    

    然后在此处创建您的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
    

    这样你可以让你的代码更干净。

    【讨论】:

    • 你为什么把Session = sessionmaker(bind=engine)放在课堂之外SessionManager
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多