0

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

なぜこれが起こっているのか分かりますか?

前もって感謝します

4

1 に答える 1

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: 実際のクエリを出力する)

于 2012-09-05T13:31:24.620 に答える