#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. Спасибо за этот ответ. Не совсем то, что я искал, но это работает. Спасибо.