psycopg2: cursor.execute сохраняет только структуру таблицы, без данных - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь сохранить некоторые таблицы, которые я создаю в своем коде, в экземпляре RDS с помощью psycopg2. Скрипт работает без проблем, и я вижу, что таблица правильно хранится в БД. Однако, если я попытаюсь получить запрос, я вижу только столбцы, но не данные:

    import pandas as pd
    import psycopg2 
    
    test=pd.DataFrame({'A':[1,1],'B':[2,2]})
    
    #connect is a function to connect to the RDS instance
    connection= connect() 
    cursor=connection.cursor()

    query='CREATE TABLE test (A varchar NOT NULL,B varchar NOT NULL);'

    cursor.execute(query)
        
    connection.commit()

    cursor.close()
    connection.close()
    

Этот скрипт работает без проблем и выводит file_check из следующего скрипта:

   connection=connect()
   # check if file already exists in SQL
   sql = """
    SELECT "table_name","column_name", "data_type", "table_schema"
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE "table_schema" = 'public'
    ORDER BY table_name  
    """
   file_check=pd.read_sql(sql, con=connection)

   connection.close()

Я получаю:

table_name column_name          data_type table_schema
0       test           a  character varying       public
1       test           b  character varying       public

, что выглядит хорошо.

Однако, выполнив следующее:

   read='select * from public.test'
   df=pd.read_sql(read,con=connection)

вернет:

Empty DataFrame
Columns: [a, b]
Index: []

Кто-нибудь знает, почему это происходит? Я не могу обойти это

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Эээ, ваш первый скрипт имеет a test_tbl фрейм данных, но он никогда не упоминается после его определения.

Вам понадобится

test_tbl.to_sql("test", connection)

или что-то подобное, чтобы написать его.

Минимальный пример:

$ createdb so63284022
$ python
>>> import sqlalchemy as sa
>>> import pandas as pd
>>> test = pd.DataFrame({'A':[1,1],'B':[2,2], 'C': ['yes', 'hello']})
>>> engine = sa.create_engine("postgres://localhost/so63284022")
>>> with engine.connect() as connection:
...     test.to_sql("test", connection)
...
>>>
$ psql so63284022
so63284022=# select * from test;
 index | A | B |   C
-------+---+---+-------
     0 | 1 | 2 | yes
     1 | 1 | 2 | hello
(2 rows)

so63284022=# \d+ test
                                   Table "public.test"
 Column |  Type  | Collation | Nullable | Default | Storage  | Stats target | Description
--------+--------+-----------+----------+---------+----------+--------------+-------------
 index  | bigint |           |          |         | plain    |              |
 A      | bigint |           |          |         | plain    |              |
 B      | bigint |           |          |         | plain    |              |
 C      | text   |           |          |         | extended |              |
Indexes:
    "ix_test_index" btree (index)
Access method: heap

so63284022=#
0 голосов
/ 07 августа 2020

Мне удалось решить эту проблему: как было указано в @AKX, я только создавал структуру таблицы, но не заполнял ее.

Теперь я также импортирую import psycopg2.extras и после этого:

   query='CREATE TABLE test (A varchar NOT NULL,B varchar NOT NULL);'

   cursor.execute(query)

Я добавляю что-то вроде:

   update_query='INSERT INTO test(A, B) VALUES(%s,%s) ON CONFLICT DO NOTHING' 
   psycopg2.extras.execute_batch(cursor, update_query, test.values)

   cursor.close()
   connection.close()

Моя таблица теперь правильно заполнена после проверки с помощью pd.read_sql

...