1 Востаннє редагувалося ping (12.07.2018 14:52:46)

Тема: Як правильно робити SELECT в POSTGRESQL з Python?

є дві таблиці, сумарно 500 колонок

треба селект на 50 колонок (тут їх список input_db_columns )

як його правильно зробити?
я знайшов спосіб тільки з AsIs але не впевнений чи це добра практика

def fetch_data(conn, offset, limit, input_db_columns):    
    cur = conn.cursor()
    q = """
            SELECT %s
            FROM %s
            INNER 
            JOIN %s ON %s = %s

            OFFSET %s
            LIMIT %s
        """
    params = (
                AsIs(','.join(input_db_columns)),
                AsIs(vendor_name + '_properties'), 
                AsIs(vendor_name + '_property_attributes'),
                AsIs(vendor_name + '_properties.property_id'),
                AsIs(vendor_name + '_property_attributes.property_id'),                

                AsIs(offset),
                AsIs(limit),
              )
    cur.execute(q, params)   
    return cur.fetchall()

2

Re: Як правильно робити SELECT в POSTGRESQL з Python?

500 колонок - вже схоже на те, що щось не так. Що це за дані? Всі заповнені чи багато NULLів? Чи є можливість перепланувати таблицю?

Подякували: leofun01, HetmanNet2

3 Востаннє редагувалося leofun01 (12.07.2018 16:36:49)

Re: Як правильно робити SELECT в POSTGRESQL з Python?

ping написав:

є дві таблиці, сумарно 500 колонок

треба селект на 50 колонок ...

Може сумарно 500 рядків ?
І треба селект на 50 рядків ?
Тоді
select ...
from ...
order by ... asc/desc
limit 50

upd: Але у вас вже є ліміт. Якщо реально 500 колонок на 2 таблиці, то це погано.

4

Re: Як правильно робити SELECT в POSTGRESQL з Python?

koala написав:

500 колонок - вже схоже на те, що щось не так. Що це за дані? Всі заповнені чи багато NULLів? Чи є можливість перепланувати таблицю?

це чужа база. Нанів багато - десь половина. багато стовпців - булеві значення

5

Re: Як правильно робити SELECT в POSTGRESQL з Python?

leofun01 написав:
ping написав:

є дві таблиці, сумарно 500 колонок

треба селект на 50 колонок ...

Може сумарно 500 рядків ?
І треба селект на 50 рядків ?
Тоді
select ...
from ...
order by ... asc/desc
limit 50

upd: Але у вас вже є ліміт. Якщо реально 500 колонок на 2 таблиці, то це погано.

рядків в кожній  під міліон і зростає потроху щодня

6

Re: Як правильно робити SELECT в POSTGRESQL з Python?

власне структура бази мене  не цікавить - я просто роблю вибірку датасету для інших аплікацій.

цікавить як правильно робити селект по списку таблиць, який динамічно формується зовні.

7

Re: Як правильно робити SELECT в POSTGRESQL з Python?

Я так розумію, ви використовуєте psycopg2.
Там же прямо написано:

Only query values should be bound via this method: it shouldn’t be used to merge table or field names to the query (Psycopg will try quoting the table name as a string value, generating invalid SQL). If you need to generate dynamically SQL queries (for instance choosing dynamically a table name) you can use the facilities provided by the psycopg2.sql module:

>>> cur.execute("INSERT INTO %s VALUES (%s)", ('numbers', 10))  # WRONG
>>> cur.execute(                                                # correct
...     SQL("INSERT INTO {} VALUES (%s)").format(Identifier('numbers')),
...     (10,))

http://initd.org/psycopg/docs/usage.htm … ql-queries

Подякували: ping, leofun01, HetmanNet3

8 Востаннє редагувалося ping (13.07.2018 09:41:10)

Re: Як правильно робити SELECT в POSTGRESQL з Python?

koala написав:

Я так розумію, ви використовуєте psycopg2.
Там же прямо написано:

Only query values should be bound via this method: it shouldn’t be used to merge table or field names to the query (Psycopg will try quoting the table name as a string value, generating invalid SQL). If you need to generate dynamically SQL queries (for instance choosing dynamically a table name) you can use the facilities provided by the psycopg2.sql module:

>>> cur.execute("INSERT INTO %s VALUES (%s)", ('numbers', 10))  # WRONG
>>> cur.execute(                                                # correct
...     SQL("INSERT INTO {} VALUES (%s)").format(Identifier('numbers')),
...     (10,))

http://initd.org/psycopg/docs/usage.htm … ql-queries

дякую! до цього я не дочитався.

оця фраза мене збила з толку:

To choose dynamically a table name in a query I used to use AsIs() from psycopg2.extensions ( http://initd.org/psycopg/docs/extension … sions.AsIs ), with the following syntax:

cur.execute("SELECT * FROM %s WHERE id = %s;", (AsIs('table_name'), id))

However, the documentation now recommends to use the new psycopg2.sql module available in version 2.7 ( http://initd.org/psycopg/docs/sql.html# … ycopg2.sql ) with the following syntax:

https://stackoverflow.com/questions/429 … sql-module

9

Re: Як правильно робити SELECT в POSTGRESQL з Python?

завдання - вибрати з великої бази 1000 останніх (по даті) записів про продані пончики

SELECT *
FROM "some_table"
WHERE "sold_date" > NOW() - INTERVAL '30 days' AND "status" = 'Sold'
ORDER BY "sold_date" DESC
LIMIT 1000

оскільки база дуже-дуже велика та ще й віддалена та ще й чужа , а в день продається біля 200 пончиків, то вирішив обмежити вибірку останнім місяцем

питання - в якому порядку буде виконуватися оце

WHERE "sold_date" > NOW() - INTERVAL '30 days' AND "status" = 'Sold'

тобто - чи реально впливає порядок умов і як воно їх обробляє?

чи буде

WHERE "status" = 'Sold' AND  "sold_date" > NOW() - INTERVAL '30 days'

виконуватися довше ?

10

Re: Як правильно робити SELECT в POSTGRESQL з Python?

ping написав:

питання - в якому порядку буде виконуватися оце

WHERE "sold_date" > NOW() - INTERVAL '30 days' AND "status" = 'Sold'

тобто - чи реально впливає порядок умов і як воно їх обробляє?

чи буде

WHERE "status" = 'Sold' AND  "sold_date" > NOW() - INTERVAL '30 days'

виконуватися довше ?

Важко дати відповідь.

На офсайті про це мовчать.
В більшості СУБД умови в WHERE перевіряються по порядку з ліва на право, але це якщо поля не індексовані. Якщо деякі поля індексовані, то спочатку перевіряються індексовані, а потім всі інші. Якщо є перевірка первинного ключа, то вона виконується навіть перед індексованими полями. Також СУБД може змінювати послідовність перевірок на основі типів даних, які перевіряються (наприклад в "WHERE name = "someName" AND userId = 10" перевірка "userId = 10" може виконатися першою, і якщо вона буде false, то name вже не буде перевірятись).
Але не факт, що в PostgreSQL, все працює саме так.

Подякували: ping, PRY2