Python SQLAlchemy具有多个数据库,并且由于创建重复索引而出错

Python SQLAlchemy具有多个数据库,并且由于创建重复索引而出错,python,postgresql,sqlite,sqlalchemy,Python,Postgresql,Sqlite,Sqlalchemy,我们有一个postgres数据库,其中有两个表Models和Drives,我们使用sqlalchemy创建查询来分析这些表中的数据 模型表具有以下架构: CREATE TABLE models ( id SERIAL PRIMARY KEY, vendor_name character varying(32) NOT NULL, model character varying(32) NOT NULL, drive_capacity bigint NOT NULL

我们有一个postgres数据库,其中有两个表
Models
Drives
,我们使用sqlalchemy创建查询来分析这些表中的数据

模型
表具有以下架构:

CREATE TABLE models (
    id SERIAL PRIMARY KEY,
    vendor_name character varying(32) NOT NULL,
    model character varying(32) NOT NULL,
    drive_capacity bigint NOT NULL
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX models_pkey ON models(id int4_ops);
CREATE INDEX idx_models_vendor_name ON models(vendor_name text_ops);
CREATE INDEX idx_models_model ON models(model text_ops); 
CREATE TABLE drives (
    id SERIAL PRIMARY KEY,
    serial_number character varying(32) NOT NULL UNIQUE,
    model integer NOT NULL REFERENCES models(id),
    role character varying(16) NOT NULL
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX drives_pkey ON drives(id int4_ops);
CREATE UNIQUE INDEX drives_serial_number_key ON drives(serial_number text_ops);
CREATE INDEX drives_role_idx ON drives(role text_ops);
CREATE INDEX index_drives_model_fk ON drives(model int4_ops);
并由
表中的
模型
类表示。py

class Models(Base, DeferredReflection):
    __tablename__ = "models"
    id = Column("id", Integer, primary_key=True)
class Drives(Base, DeferredReflection):
    __tablename__ = "drives"
    id = Column("id", Integer, primary_key=True)
    model = Column("model", Integer, ForeignKey(Models.id), nullable=False)
驱动器
表具有以下架构:

CREATE TABLE models (
    id SERIAL PRIMARY KEY,
    vendor_name character varying(32) NOT NULL,
    model character varying(32) NOT NULL,
    drive_capacity bigint NOT NULL
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX models_pkey ON models(id int4_ops);
CREATE INDEX idx_models_vendor_name ON models(vendor_name text_ops);
CREATE INDEX idx_models_model ON models(model text_ops); 
CREATE TABLE drives (
    id SERIAL PRIMARY KEY,
    serial_number character varying(32) NOT NULL UNIQUE,
    model integer NOT NULL REFERENCES models(id),
    role character varying(16) NOT NULL
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX drives_pkey ON drives(id int4_ops);
CREATE UNIQUE INDEX drives_serial_number_key ON drives(serial_number text_ops);
CREATE INDEX drives_role_idx ON drives(role text_ops);
CREATE INDEX index_drives_model_fk ON drives(model int4_ops);
并且在
表中用
驱动器
类表示。py

class Models(Base, DeferredReflection):
    __tablename__ = "models"
    id = Column("id", Integer, primary_key=True)
class Drives(Base, DeferredReflection):
    __tablename__ = "drives"
    id = Column("id", Integer, primary_key=True)
    model = Column("model", Integer, ForeignKey(Models.id), nullable=False)
正如您所注意到的,这两个表都在特定列上创建了额外的索引。在我们的单元测试基础设施中,我们创建了一个内存中的sqlite数据库,并使用与postgresql数据库相同的模式创建了表和索引。然后,我们向sqlite实例插入假行,在sqlite数据库上运行真实查询,并检查真实查询的正确性。代码如下所示:

sqlite_engine = create_engine('sqlite:///', echo=True)
from tables import Base
Base.metadata.create_all(bind=sqlite_engine)
# add fake rows to sqlite
# run real query on sqlite engine
# compare against expected output to confirm correctness of real queries.
但是,我在上面的
create\u all
步骤中遇到了一个错误。虽然我能够创建models表及其索引,但我得到了
驱动器
表的索引已存在错误:

cursor = <sqlite3.Cursor object at 0x7f466b877570>
statement = 'CREATE INDEX index_drives_model_fk ON drives (model)'
parameters = ()
context = <sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext object at 0x7f466b2f4160>

    def do_execute(self, cursor, statement, parameters, context=None):
>       cursor.execute(statement, parameters)
E       sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) index index_drives_model_fk already exists [SQL: 'CREATE INDEX index_drives_model_fk ON drives (model)'] (Background on this error at: http://sqlalche.me/e/e3q8)
如果注意到上面代码段的最后6行,您将看到创建了两次
index\u drives\u model\u fk
,因此出现了错误。我的问题是:是什么让sqlalchemy向
驱动器
表发出两个索引创建,但是
模型
表(以及相关的索引)似乎创建正确?我还可以确认,如果我从postgres
drive
表中删除
drives\u role\u idx
index\u drives\u model\u fk
,则一切正常