Как использовать переменную, определенную вне оператора select, внутри оператора select - PullRequest
0 голосов
/ 10 июля 2020

Я хочу использовать оператор select, чтобы изолировать первые 525 600 строк из набора данных, что довольно просто с помощью оператора LIMIT, однако я хотел бы сделать это для 58 отдельных таблиц. У меня есть список имен таблиц, и я пытаюсь определить функцию для перебора всех таблиц, однако имя переменной, которое я определил в функции, не распознается в операторе sql. Вот мой код:

import pandas as pd
from sqlalchemy import create_engine
import psycopg2

mylist = ['egauge13830','egauge13836','egauge13974','egauge14018','egauge14795','egauge15601',
          'egauge15623','egauge16133','egauge16608','egauge16616','egauge17073','egauge17311',
          'egauge18158','egauge18350','egauge18544','egauge19696','egauge19810','egauge19821',
          'egauge20358','egauge20407','egauge20670','egauge20925','egauge21932','egauge22084',
          'egauge22271','egauge22785','egauge23534','egauge24121','egauge24318','egauge2474',
          'egauge26086','egauge26944','egauge27467','egauge28351','egauge28489','egauge2850',
          'egauge2852','egauge28684','egauge30039','egauge30378','egauge3166','egauge3167',
          'egauge3171','egauge32290','egauge32507','egauge33764','egauge3608','egauge3611',
          'egauge4183','egauge5198','egauge6437','egauge7692','egauge7729','egauge7731',
          'egauge8253','egauge8617','egauge8816','egauge9102']

def first_chunk(egauge):
    engine = create_engine('postgresql://postgres:postgres@stargate/profiles')
    start_time_stmnt = """
    SELECT *
    FROM egauge
    LIMIT 525600
    """
    first = pd.read_sql_query(start_time_stmnt, engine)

def iterthro(data):
    for x in data:
        first_chunk(x)

iterthro(mylist)

Полученная мной ошибка говорит мне, что отношение egauge не существует. Кстати, я знаю, что этот код довольно бесполезен, поскольку он ничего не делает с выбранными строками, но я планирую сделать больше с этим и хотел бы выяснить эту проблему, прежде чем двигаться дальше. Я пробовал простые вещи, такие как разные комбинации цитат, и не уверен, делаю ли я простую синтаксическую ошибку или мой лог c полностью ошибочен. Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 10 июля 2020
  • Здесь egauge - это переменная. Таким образом, вы можете использовать "{}".format(x) для использования переменной в строке. Надеюсь, это поможет!
def first_chunk(egauge):
    engine = create_engine('postgresql://postgres:postgres@stargate/profiles')
    start_time_stmnt = """
    SELECT *
    FROM {}
    LIMIT 525600
    """.format(egauge)
    first = pd.read_sql_query(start_time_stmnt, engine)
0 голосов
/ 10 июля 2020

Это работает? У меня нет примера для проверки, но я думаю, вам нужно лучше отделить синтаксис от переменных.

def first_chunk(egauge):
    engine = create_engine('postgresql://postgres:postgres@stargate/profiles')
    start_time_stmnt = " SELECT * " \
                       " FROM " + egauge + \
                       " LIMIT 525600 "
    first = pd.read_sql_query(sql=start_time_stmnt, con=engine, params=())
...