我需要在我的应用程序中查询数据库,我从此文件导入会话。
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()
答案 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:显式测试后更改了代码。