запрос sqlalchemy по массиву атрибутов [дубликат]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

155
задан wonzbak 22 December 2011 в 13:16
поделиться

5 ответов

Как насчет

session.query(MyUserClass).filter(MyUserClass.id.in_((123,456))).all()

edit: Без ORM это будет

session.execute(
    select(
        [MyUserTable.c.id, MyUserTable.c.name], 
        MyUserTable.c.id.in_((123, 456))
    )
).fetchall()

select() принимает два параметра, первый один - список полей для извлечения, второй - условие where. Вы можете получить доступ ко всем полям объекта таблицы через свойство c (или columns).

194
ответ дан Ilja Everilä 26 August 2018 в 16:22
поделиться

С выражением API, который на основе комментариев запрашивает этот вопрос, вы можете использовать метод in_ соответствующего столбца.

Запросить

SELECT id, name FROM user WHERE id in (123,456)

use

myList = [123, 456]
select = sqlalchemy.sql.select([user_table.c.id, user_table.c.name], user_table.c.id.in_(myList))
result = conn.execute(select)
for row in result:
    process(row)

Это предполагает, что user_table и conn определены соответствующим образом.

5
ответ дан Carl 26 August 2018 в 16:22
поделиться

Альтернативный способ - использовать исходный SQL-режим с SQLAlchemy, я использую SQLAlchemy 0.9.8, python 2.7, MySQL 5.X и MySQL-Python в качестве соединителя, в этом случае необходим кортеж. Мой код, указанный ниже:

id_list = [1, 2, 3, 4, 5] # in most case we have an integer list or set
s = text('SELECT id, content FROM myTable WHERE id IN :id_list')
conn = engine.connect() # get a mysql connection
rs = conn.execute(s, id_list=tuple(id_list)).fetchall()

Надеюсь, что все работает для вас.

20
ответ дан Jet Yang 26 August 2018 в 16:22
поделиться

Просто добавление к ответам выше.

Если вы хотите выполнить SQL с помощью инструкции «IN», вы можете сделать это:

ids_list = [1,2,3]
query = "SELECT id, name FROM user WHERE id IN %s" 
args = [(ids_list,)] # Don't forget the "comma", to force the tuple
conn.execute(query, args)

Две точки:

  • нет необходимости в Parenthesis для оператора IN (например, «... IN (% s)»), просто поставьте «... IN% s»
  • Подключите список ваших идентификаторов как один из элементов кортеж. Не забывайте, что «,»: (ids_list,)

EDIT Следите за тем, что если длина списка равна одному или нулю, это вызовет ошибку!

2
ответ дан Majid 26 August 2018 в 16:22
поделиться

Предполагая, что вы используете декларативный стиль (т.е. классы ORM), это довольно просто:

query = db_session.query(User.id, User.name).filter(User.id.in_([123,456]))
results = query.all()

db_session здесь находится ваш сеанс базы данных, а User - это класс ORM с __tablename__ равным "users".

99
ответ дан Xion 26 August 2018 в 16:22
поделиться
Другие вопросы по тегам:

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