我正在使用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 = ""
我不想使用此代码创建表,我使用所需的约束手动创建所需的表。
我读到第一个示例是针对单个列的唯一约束,第二个示例针对多个唯一约束。但是我发现的例子总是使用表格,在我的案例(类)中只使用了示例三。
我希望有人可以帮助我。谢谢你的时间!
答案 0 :(得分:1)
sqlalchemy中唯一约束的定义确实仅用于模式生成(创建表)。 此外,主要RDBMS之间存在差异(如特定于多列之间)以及确切可能。这是 - 当由sqlalchemy支持时 - 由方言处理并且或多或少不透明。
所以......如果你把他们排除在外,你不会受到影响。
但是
我将它们留在文档代码中,它们可能是一个有用的提醒,为什么底层RDBMS以某种方式运行。