2012-12-21 37 views
1

我目前正试图将一个为MySQL数据库设计的程序转移到MS-SQL数据库上,并且遇到了一些麻烦。我发现默认情况下,MySQL没有区分大小写,因为MS-SQL具有区分大小写。这导致了与下面列出的代码类似的一些问题。为MS-SQL创建不区分大小写的SQLAlchemy查询

class Employee(Base): 
    __tablename__ = "Employees" 
    Id = Column(Integer(unsigned=True), 
       primary_key=True, nullable=False, unique=True) 
    DisplayName = Column(String(64), 
         nullable=False) 
    #more columns 

def get_employees(sql_session, param, columns=None, partial_match=True): 
    if not columns: 
     columns = [Employee.Id, Employee.DisplayName] 
    clauses = [] 

    if partial_match: 
     clauses.append(Employee.DisplayName.startswith(param)) 

    whereclause = and_(*clauses) 
    stmt = select(columns, whereclause) 
    return sql_session.execute(stmt) 

我知道SQL关键字COLLATE,但我不知道如何实现,或者如果它即使在这种情况下使用的最佳选择。你会用什么建议来创建一个不区分大小写的使用SQLAlchemy的LIKE查询?

  • 的Python 2.7.7
  • SQLAlchemy的0.7.7

回答

2

这是一个有些奇怪,以我的经验MS SQL Server是不区分大小写默认情况下,虽然您可以选择将其设置为区分大小写使用数据库的整理设置。

您可以使用COLLATE与SQLAlchemy的(见here),所以你应该能够做到(我还没有这样尝试过我自己):

clauses.append(Employee.DisplayName.startswith(collate(param, 'SQL_Latin1_General_CP1_CI_AS'))) 

SQL Server还支持正则表达式状的图案与LIKE查询匹配,所以或者你可以在你的参数值中使用这个例如'[vV]alue%'

+0

感谢您的帮助,它完美地解决了MS-SQL的问题,但它确实造成了一个小问题。由于“未知整理”,添加整理功能会破坏与MySQL的兼容性。你有任何解决这两个问题的建议吗? – JBolton

+1

恐怕整理字符串是特定于RDBMS的,所以您需要在MySQL中使用不同的内容 - 请参阅文档[here](https://dev.mysql.com/doc/refman/5.5/en/charset- charsets.html) –