Вы можете использовать тот факт, что SQLAlchemy является отличным построителем запросов.Либо отразите таблицу customer , либо создайте метаданные вручную:
from sqlalchemy import MetaData, select
metadata = MetaData()
metadata.reflect(engine, only=['customer'])
customer = metadata.tables['customer']
и создайте запрос , что позволяет SQLAlchemy беспокоиться о правильностииспользование заполнителей, преобразование данных и т. д. Вы ищете customer строк, где id находится в наборе идентификаторов из data1 , достигнутых в SQL с помощью оператора IN :
query = select([customer.c.id,
customer.c.column3,
customer.c.column4]).\
where(customer.c.id.in_(data1['id']))
data2 = pd.read_sql_query(query, engine)
Если вы хотите продолжать использовать строки SQL вручную, вы можете построить параметризованный запрос следующим образом:
placeholders = ','.join(['%s'] * data1['id'].count())
# Note that you're not formatting the actual values here, but placeholders
query = f"SELECT id, column3, column4 FROM customer WHERE id IN ({placeholders})"
data2 = pd.read_sql_query(query, engine, params=data1['id'])
В целом, полезно научиться использовать заполнителивместо того, чтобы смешивать SQL и значения путем форматирования / объединения строк, так как это может подвергнуть вас внедрению SQL, если вы обрабатываете данные, созданные пользователем.Обычно вы бы указывали обязательные заполнители в строке запроса напрямую, но требуется некоторое строение строки, если у вас есть переменное количество параметров 1 .
1 :Некоторые драйверы DB-API, такие как psycopg2 , позволяют передавать кортежи и списки в виде скалярных значений и знают, как создать подходящий SQL.