Как выбрать строки, которые равны набору сущностей таблицы [duplicate]

Если все остальное не удается, перекомпилируйте.

Недавно я смог избавиться от нерешенной внешней ошибки в Visual Studio 2012, просто перекомпилировав нарушивший файл. Когда я перестроил, ошибка исчезла.

Это обычно происходит, когда две (или более) библиотеки имеют циклическую зависимость. Библиотека A пытается использовать символы в B.lib и библиотеке B пытается использовать символы из A.lib. Ничего не существует для начала. Когда вы пытаетесь скомпилировать A, шаг ссылки завершится неудачно, потому что он не может найти B.lib. A.lib будет сгенерирован, но не будет dll. Затем вы компилируете B, который будет успешным и сгенерирует B.lib. Повторная компиляция A теперь будет работать, потому что теперь найден B.lib.

7
задан vvladymyrov 9 December 2013 в 17:36
поделиться

3 ответа

Я закончил использование решения на основе test (): сгенерировал «(a, b) in ((: a1,: b1), (: a2,: b2), ...)» с именованными связями и генерированием словарь с значениями привязки связывания.

params = {}
for counter, r in enumerate(records):
    a_param = "a%s" % counter
    params[a_param] = r['a']
    b_param = "b%s" % counter
    params[b_param] = r['b']
    pair_text = "(:%s,:%s)" % (a_param, b_param)
    enum_pairs.append(pair_text)
multicol_in_enumeration = ','.join(enum_pairs)
multicol_in_clause = text(
    " (a,b) in (" + multicol_in_enumeration + ")")
q = session.query(Table.id, Table.a,
                            Table.b).filter(multicol_in_clause).params(params)

Еще один вариант, который я подумал об использовании mysql upserts, но это сделало бы целое включенным даже менее переносимым для другого db-механизма, а затем с использованием предложения multicolumn in.

Обновление SQLAlchemy имеет конструкцию sqlalchemy.sql.expression.tuple _ (* clauses, ** kw) , которая может использоваться для той же цели. (Я еще не пробовал)

0
ответ дан vvladymyrov 24 August 2018 в 01:15
поделиться

Предполагая, что ваша модель определена в Page, вот пример с использованием tuple_ :

keys = [
    (2752937066, 'http://members.aye.net/~gharris/blog/'),
    (3799762538, 'http://www.coxandforkum.com/')
]

select([
    Page.url
]).select_from(
    Page
).where(
    tuple_(Page.url_crc, Page.url).in_(keys)
)

Или, используя API запросов:

session.query(Page.url).filter(tuple_(Page.url_crc, Page.url).in_(keys))
7
ответ дан Ilja Everilä 24 August 2018 в 01:15
поделиться

Я не думаю, что в настоящее время это возможно в sqlalchemy, и не все RDMBS поддерживают это. Вы всегда можете преобразовать это в условие OR(AND...), хотя:

filter_rows = [
    (2752937066, 'http://members.aye.net/~gharris/blog/'),
    (3799762538, 'http://www.coxandforkum.com/'),
    ]
qry = session.query(Page)
qry = qry.filter(or_(*(and_(Page.url_crc == crc, Page.url == url) for crc, url in filter_rows)))
print qry

должно вызывать нечто вроде (для SQLite):

SELECT  pages.id AS pages_id, pages.url_crc AS pages_url_crc, pages.url AS pages_url
FROM    pages
WHERE   pages.url_crc = ? AND pages.url = ? OR pages.url_crc = ? AND pages.url = ?
-- (2752937066L, 'http://members.aye.net/~gharris/blog/', 3799762538L, 'http://www.coxandforkum.com/')

Кроме того, вы можете объединить два столбца в только один:

filter_rows = [
    (2752937066, 'http://members.aye.net/~gharris/blog/'),
    (3799762538, 'http://www.coxandforkum.com/'),
    ]
qry = session.query(Page)
qry = qry.filter((func.cast(Page.url_crc, String) + '|' + Page.url).in_(["{}|{}".format(*_frow) for _frow in filter_rows]))
print qry

, который создает ниже (для SQLite), поэтому вы можете использовать IN:

SELECT  pages.id AS pages_id, pages.url_crc AS pages_url_crc, pages.url AS pages_url
FROM    pages
WHERE   (CAST(pages.url_crc AS VARCHAR) || ? || pages.url) IN (?, ?)
-- ('|', '2752937066|http://members.aye.net/~gharris/blog/', '3799762538|http://www.coxandforkum.com/')
1
ответ дан van 24 August 2018 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: