2012-09-05 54 views
0

我正在使用sqlalchemy 0.7和MySQL服務器版本5.1.63。sqlalchemy不區分大小寫的查詢sql鍊金術

我下表對我的數據庫:

CREATE TABLE `g_domains` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(255) NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE INDEX `name` (`name`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 

對應型號是:

class GDomain(Base): 
    __tablename__ = 'g_domains' 
    __table_args__ = { 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8', 
     'mysql_collate': 'utf8_general_ci' 
    } 

    id = Column(mysql.BIGINT(unsigned=True), primary_key=True) 
    name = Column(mysql.VARCHAR(255, collation='utf8_general_ci'), 
        nullable=False, unique=True) 

在SQL鍊金術返回下面的查詢沒有行:

session.query(GDomain).filter(GDomain.name.in_(domain_set)). 
limit(len(domain_set)).all() 

哪裏domain_set是一個包含一些域名的Python列表,如

domain_set = ['www.google.com', 'www.yahoo.com', 'www.AMAZON.com'] 

雖然表中有一個行(1,www.amazon.com)上述查詢只返回 (www.google.com,www.yahoo.com)。

當我運行SQL查詢:

SELECT * FROM g_domains 
WHERE name IN ('www.google.com', 'www.yahoo.com', 'www.AMAZON.com') 

你有一個想法,爲什麼發生這種情況?

在此先感謝

回答

0

什麼是model_domain變量?通常看起來像這樣:

session.query(GDomain).filter(GDomain.name.in_(domain_set)). 
limit(len(domain_set)).all() 

請注意,GDomain在兩個地方都使用。另外,您可以使用別名:

domains = orm.aliased(GDomain, name='domain') 
session.query(domains).filter(domains.name.in_(domain_set)) 

你總是可以嘗試調試,打印,通過SQLAlchemy的產生的查詢(見:SQLAlchemy: print the actual query

+0

謝謝回答查詢是正確的。問題是sqlalchemy似乎不尊重數據庫整理(utf8_general_ci) –