Accessing same db.session across different modules in sqlalchemy

时间:2015-07-28 16:04:54

标签: python api session sqlalchemy crud

I am very new to sqlalchemy and am trying to figure out how to get things cleaner and connecting.

I have created a /model base.py doc where I have created a session and established all my entities in tables (along with relationships and etc.). I want to create another module in which I operate CRUD operations on the entities (tables) in base.py. This file is called object.py and has the class BaseAPI(object) and has the different functions "create" "read" "update" and "delete". I want to make sure that I am connecting to my table (base.py) in object.py and operating on the entity User. For this case, the entity (table) is Users.

This is what I have in the 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)

Am I importing too many things? Do I need to import all the sqlalchemy tools? Does my init constructor under class BaseAPI need to instantiate the DB session?

1 个答案:

答案 0 :(得分:4)

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

但是使用connectionuser 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

这样您就可以使代码更清晰。