SQLAlchemy模拟会话连接

时间:2016-08-18 15:20:43

标签: python session sqlalchemy

我需要在我的应用程序中查询数据库,我从此文件导入会话。

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker

db_name = 'analytics'
db_url = 'postgresql+psycopg2://**:**@localhost:5432/{0}'.format(db_name)
Engine = create_engine(db_url, echo=False)
SessionMaker = sessionmaker(bind=Engine, autoflush=False)
Session = scoped_session(SessionMaker)

Base = declarative_base()

我正在编写一些单元测试并且需要模拟Session对象,这样无论何时在我的应用程序中导入它,它都会连接到unittest数据库而不是分析数据库。

class FacebookTest(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        """
        create unittest database and insert Premier League 2015-2016 season
        """
        con = connect(user='**', host='localhost', password='**', database='postgres')
        con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
        cur = con.cursor()
        cur.execute('DROP DATABASE IF EXISTS unittest')
        cur.execute('CREATE DATABASE unittest')
        cur.close()
        con.close()
        Engine = create_engine('postgresql+psycopg2://**:**@localhost:5432/unittest')
        Base.metadata.create_all(Engine)
        Session.connection = Engine.connect()

1 个答案:

答案 0 :(得分:1)

将模拟数据库设置在其他端口上,例如5433,然后根据要连接的数据库更改端口。

您可以这样做。假设您有一个db.py,您可以在其中启动会话并将其全部导入。像这样修改它(忽略对配置器的引用,这是我的内部模块):

import psycopg2
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import configurator

Base = declarative_base()

def connect():
    cfg = configurator.Configurator("database")
    return psycopg2.connect(
        user=cfg.user, host=cfg.host, dbname=cfg.db, port=cfg.port, password=cfg.pwd
    )

def connect_test():
    conn_string = (
        "host='localhost' user='postgres' password='yourPassword' port='5433'"
    )
    return psycopg2.connect(conn_string)

def Session(database='dev'):
    if database == 'dev':
        engine = create_engine("postgresql://", creator=connect)
    elif database == 'test':
        engine = create_engine("postgresql://", creator=connect_test)
    Session = sessionmaker(bind=engine)
    return Session()

更新:重要的更正-在return session()中添加了括号,对此表示抱歉。

UPDATE2:显式测试后更改了代码。