извлекать запись и создавать новую запись с модификацией

#python #postgresql #psycopg2

#python #postgresql #psycopg2

Вопрос:

Используя python, psychopg2 пытается выяснить, как извлечь запись и создать новую запись с модификацией из указанной записи. У меня все работает, подключение, создание новых записей. Я застрял на этапе изменения извлеченной записи.

newrecord=курсор.fetchone()

и теперь я застрял со следующим шагом. Как мне определить столбец, чтобы я мог его изменить. Таблица — это простая таблица с идентификатором и столбцом true / false. Кажется простой задачей.

 
import psycopg2

connection = psycopg2.connect(user = "postgres", 
password = "secret", database = "example")

cursor = connection.cursor()

cursor.execute('DROP TABLE IF EXISTS table3;')

cursor.execute ('''
CREATE TABLE table3 (
    id INTEGER PRIMARY KEY,
    completed BOOLEAN NOT NULL DEFAULT FALSE
);
''')

data0 = {
    'id': 1,
    'completed': True
}
data = {
    'id': 2,
    'completed': False
}
data2 = {
    'id': 3,
    'completed': False
}
data3 = {
    'id': 4,
    'completed': True
}
data4 = {
    'id': 5,
    'completed': True
}
SQL = 'INSERT INTO table3 (id,completed) values (%(id)s, %(completed)s);'

cursor.execute (SQL, data0)
cursor.execute (SQL, data)
cursor.execute (SQL, data2)
cursor.execute (SQL, data3)
cursor.execute (SQL, data4)

cursor.execute('SELECT * FROM table3;')
newrecord = cursor.fetchone()


print(newrecord)
# cursor.execute(SQL, newrecord)
# result = cursor.fetchall()
# for row in result:
#     print (row)

connection.commit()

connection.close()
cursor.close()
  

Комментарии:

1. UPDATE table2 SET completed = %s WHERE id = %s ?

2. задача состоит в том, чтобы захватить запись и создать новую запись на основе выбранной записи, какой бы измененной она ни была. Не обновление, а создание новой на основе выбранной записи.

Ответ №1:

Хотя совершенно неясно, с какой проблемой вы столкнулись — я пытаюсь ответить.
Вы могли INSERT бы из a SELECT запретить выборку и «повторную отправку» записи в базу данных:

 import psycopg2

connection = psycopg2.connect("dbname=mf port=5959 host=localhost user=mf_usr")
cursor = connection.cursor()
cursor.execute('DROP TABLE IF EXISTS table3;')

cursor.execute ('''
CREATE TABLE table3 (
    id INTEGER PRIMARY KEY,
    name TEXT,
    price INT,
    completed BOOLEAN NOT NULL DEFAULT FALSE
);
''')

data0 = {
    'id': 1,
    'completed': True
}
data = {
    'id': 2,
    'completed': False
}
data2 = {
    'id': 3,
    'completed': False
}
data3 = {
    'id': 4,
    'completed': True
}
data4 = {
    'id': 5,
    'completed': True
}

# Insert 5 rows
SQL = 'INSERT INTO table3 (id,name,price,completed) values (%(id)s, %(name)s, %(price)s, %(completed)s);'
for i in range(0, 5):
    cursor.execute (SQL, {'id': i, 'price': (i 1)*1000, 'name': f"data_{i}", 'completed': True})


# COPY a record, just modifying id and completed.
COPY_SQL = """
    INSERT INTO table3 (id, name, price, completed)
    (SELECT %(id)s, name, price, %(completed)s from table3 where name=%(name)s)
"""

COPY_VALUES = {'id': 6, 'name': 'data_0', 'completed': False}
cursor.execute(COPY_SQL, COPY_VALUES)

# FETCH: We end up with 2 records for data_n with completed True and False!
cursor.execute("SELECT * FROM table3 where name = '%(name)s'" % COPY_VALUES)
print(cursor.fetchall())

connection.commit()
connection.close()
cursor.close()
  

Выход:

 [(0, 'data_0', 1000, True), (6, 'data_0', 1000, False)]
  

Комментарии:

1. Спасибо за этот ответ. Не совсем то, что я искал, но это работает. Спасибо.