Python 使用SQLAlchemy和MS SQL Server实现唯一if not Null约束

Python 使用SQLAlchemy和MS SQL Server实现唯一if not Null约束,python,sql-server,sqlalchemy,Python,Sql Server,Sqlalchemy,我想在列上强制一个唯一约束,但前提是它不为null。这是SQLite中的默认行为,但不是MS SQL Server中的默认行为 在SQL Server中实现这一点的方法似乎是使用带有where子句的索引,如中所述。我的问题是如何在SQLAlchemy中做到这一点,并使它仍然与SQLite一起工作 我想这大概就是我想要的: class MyClass(Base): __tablename__ = 'myclass' __table_args__ = (Index('unique_i

我想在列上强制一个唯一约束,但前提是它不为null。这是SQLite中的默认行为,但不是MS SQL Server中的默认行为

在SQL Server中实现这一点的方法似乎是使用带有where子句的索引,如中所述。我的问题是如何在SQLAlchemy中做到这一点,并使它仍然与SQLite一起工作

我想这大概就是我想要的:

class MyClass(Base):
    __tablename__ = 'myclass'
    __table_args__ = (Index('unique_index', <where clause?>, unique=True)
    my_column = Column(Integer) # The column I want unique if not null
class MyClass(基本类):
__tablename_uu='myclass'
__表参数(索引('unique_Index',unique=True)
my_column=column(Integer)#如果不为null,则需要唯一的列

where
是一个表达式,它将索引放在
我的
列中,而不是
NULL
。通过读取for索引,这似乎是可能的,但我不知道我需要什么表达式。非常感谢您提供此方面的帮助或其他方法。

使用筛选索引的SQL Server
解决方案:

CREATE TABLE tab(col INT);
CREATE UNIQUE INDEX uq_tab_col ON tab(col) WHERE col IS NOT NULL;

INSERT INTO tab(col) VALUES (1),(2),(NULL),(NULL);

-- INSERT INTO tab(col) VALUES (1);
-- Cannot insert duplicate key row in object 'dbo.tab' with unique index 'uq_tab_col'.
-- The duplicate key value is (1).

SELECT * FROM tab;

为以后发现此功能的任何其他人提供。SQL Alchemy现在支持此功能

将sqlalchemy作为sa导入
sa.表格(
sa.Column('Column',sa.String(50),null=True),
sa.Index('uq\u column\u允许为空,'mssql\u其中=sa.text('column NOT NULL'),
)
如果您打算像我一样使用alembic,请使用此代码

将sqlalchemy作为sa导入
将alembic作为op导入
创建索引(
name='uq\u column\u name',
表_name='table',
columns=['column'],
mssql_其中=sa.text('列不为空'),
)

这使用了sqlalchemy的文本,并且
create_index
mssql\u where=

目前
sqlalchemy
不支持这种开箱即用的方法。但是我认为值得创建一个基于sqlalchemy的bitbucket存储库,甚至更好地实现它。我认为它的实现应该与其他RDBMS特定参数类似例如。