Python SQLAlchemy在测试期间自动恢复增量(pytest)
我在Python SQLAlchemy在测试期间自动恢复增量(pytest),python,postgresql,sqlalchemy,pytest,Python,Postgresql,Sqlalchemy,Pytest,我在conftest.py @pytest.fixture(scope='function') def db_session(db, request): """Creates a new database session for a test.""" engine = create_engine(DefaultConfig.SQLALCHEMY_DATABASE_URI, connect_args={"options": "-c timezone=utc"}) DbSes
conftest.py
@pytest.fixture(scope='function')
def db_session(db, request):
"""Creates a new database session for a test."""
engine = create_engine(DefaultConfig.SQLALCHEMY_DATABASE_URI, connect_args={"options": "-c timezone=utc"})
DbSession = sessionmaker(bind=engine)
session = DbSession()
connection = engine.connect()
transaction = connection.begin()
options = dict(bind=connection, binds={})
session = db.create_scoped_session(options=options)
db.session = session
yield session
transaction.rollback()
connection.close()
session.remove()
import pytest
from package.model import Project
def test_create_project(db_session):
project = Project(project_name="Test_Project")
db_session.add(project)
db_session.commit()
assert project.project_id > 0
assert project.project_id == 65 # supposed to be the next auto-increment value
assert db_session.query(Project).filter_by(project_name="Test_Project").first() != None
在我的测试脚本中test\u project.py
@pytest.fixture(scope='function')
def db_session(db, request):
"""Creates a new database session for a test."""
engine = create_engine(DefaultConfig.SQLALCHEMY_DATABASE_URI, connect_args={"options": "-c timezone=utc"})
DbSession = sessionmaker(bind=engine)
session = DbSession()
connection = engine.connect()
transaction = connection.begin()
options = dict(bind=connection, binds={})
session = db.create_scoped_session(options=options)
db.session = session
yield session
transaction.rollback()
connection.close()
session.remove()
import pytest
from package.model import Project
def test_create_project(db_session):
project = Project(project_name="Test_Project")
db_session.add(project)
db_session.commit()
assert project.project_id > 0
assert project.project_id == 65 # supposed to be the next auto-increment value
assert db_session.query(Project).filter_by(project_name="Test_Project").first() != None
每次运行测试时,自动递增的主键都会增加。即使我使用了db_session
fixture,主键序列也不会回滚
我还尝试在测试之间调用db\u session.begin\u nested()
和db\u session.rollback()
,但主键仍然会递增
def test_create_project(db_session):
db_session.begin_nested()
project = Project(project_name="Test_Project")
db_session.add(project)
db_session.commit()
assert project.project_id > 0
assert project.project_id == 65
assert db_session.query(Project).filter_by(project_name="Test_Project").first() != None
db_session.rollback()
测试后如何恢复自动增量值
环境
- 数据库:PostgreSQL 9.6.5
- 烧瓶0.12.2
- SQLAlchemy 1.1.12
- 使用sqlalchemy是不可能的。但是,您可以在所需的起点更改并重新启动序列。默认情况下,postgresql将序列命名为
\uu seq
。检查您的模式以找出序列名称。这是改变序列所必需的
下面是一个小脚本来说明这一点:
CREATE TABLE test(col1 SERIAL PRIMARY KEY, val TEXT);
INSERT INTO test (val) VALUES ('abc'), ('def'), ('ghi');
SELECT * FROM test;
-- output
1 abc
2 def
3 ghi
DELETE FROM test WHERE col1 = 3;
SELECT * FROM test;
-- output
1 abc
2 def
-- now alter the sequence so that the next insert gets value 3 in col1
ALTER SEQUENCE test_col1_seq START 3 RESTART;
INSERT INTO test (val) VALUES ('xyz');
SELECT * FROM test;
-- output
1 abc
2 def
3 xyz