在Python类中区别和使用UniqueConstraint

时间:2017-04-04 05:36:01

标签: python sqlalchemy unique-constraint

我正在使用python 2.7和sqlalchemy 0.9.9。 在我们的代码中,我找到了定义UniqueConstraint的不同方法,我不知道哪一个是正确的,或者我们根本不需要它们(我们不想用我们的代码创建一个表)。

示例1:

class ExampleOne(OrmModelBase, TableModelBase):

__tablename__ = 'example_one'

example_one_id = Column(Integer, Sequence('seq_example_one_example_one_id'), 
                        primary_key=True, nullable=False)

example_one_name = Column(String, unique=True, nullable=False)

def __init__(self):
    self.example_one_id = self.getNextPkValue()
    self.example_one_name = ''

示例2(版本1):

class ExampleTwo(OrmModelBase, TableModelBase):

__tablename__ = 'example_two'
example_two_id = Column(Integer, Sequence(
    'seq_example_two_example_two_id'), primary_key=True,
    nullable=False)

example_two_name = Column(String, nullable=False)

UniqueConstraint(
    "example_two_id", "example_two_name",
    name="uk_example_two_example_two_id_example_two_name")

def __init__(self):
    self.example_two_id = self.getNextPkValue()
    self.example_two_name = example_two_name

示例2(版本2):

class ExampleTwo(OrmModelBase, TableModelBase):

__tablename__ = 'example_two'
example_two_id = Column(Integer, Sequence(
    'seq_example_two_example_two_id'), primary_key=True,
    nullable=False)

example_two_name = Column(String, nullable=False)

uk_example_two_example_two_id_example_two_name = UniqueConstraint(
"example_two_id", "example_two_name")

def __init__(self):
    self.example_two_id = self.getNextPkValue()
    self.example_two_name = example_two_name

示例3:

class ExampleThree(OrmModelBase, TableModelBase):
__tablename__ = 'example_three'

example_three_id = Column(Integer,
                          Sequence('example_three_example_three_id'),
                          primary_key=True)

example_three_name = Column(String, nullable=False)

__table_args__ = (
    UniqueConstraint("example_three_name", name="uk_example_three_name"),
)

def __init__(self):
    self.example_three_id = self.getNextPkValue()
    self.example_three_name = ""

我不想使用此代码创建表,我使用所需的约束手动创建所需的表。

  1. 当我不创建表时,是否需要唯一约束(或primary_key,可空等)的定义?有效果吗? 我在课堂上写了3个版本中的一个?
  2. 我读到第一个示例是针对单个列的唯一约束,第二个示例针对多个唯一约束。但是我发现的例子总是使用表格,在我的案例(类)中只使用了示例三。

    1. 使用唯一约束和区别有什么不同?
    2. 我希望有人可以帮助我。谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

sqlalchemy中唯一约束的定义确实仅用于模式生成(创建表)。 此外,主要RDBMS之间存在差异(如特定于多列之间)以及确切可能。这是 - 当由sqlalchemy支持时 - 由方言处理并且或多或少不透明。

所以......如果你把他们排除在外,你不会受到影响。

但是

我将它们留在文档代码中,它们可能是一个有用的提醒,为什么底层RDBMS以某种方式运行。