Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy在测试期间自动恢复增量(pytest)_Python_Postgresql_Sqlalchemy_Pytest - Fatal编程技术网

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