Sqlalchemy不区分大小写查询sql炼金术

时间:2012-09-05 13:20:38

标签: python mysql sqlalchemy

我使用的是sqlalchemy 0.7和MySQL服务器版本5.1.63。

我的数据库中有以下表格:

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 alchemy中的以下查询不返回任何行:

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')

你知道为什么会这样吗?

提前致谢

1 个答案:

答案 0 :(得分: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