Как дублировать значение (строку) в бд Access при помощи python?
Прошу помощи. Хочу создать копию строки в базе данных Access с помощью python. Но в строке имеется некие двоичные данные, которые не получается скопировать обычными методами, которые я знаю (хотя python и считывает и печатает содержимое если просишь). Возможно ли вообще осуществить, то что я хочу, если да то как? Код моих манипуляций ниже.
import pyodbc
MDB = "C:\\Users\\Public\\Documents\\db1.mdb"
DRV = '{Microsoft Access Driver (*.mdb, *.accdb)}'
con = pyodbc.connect("DRIVER={};DBQ={};PWD={}".format(DRV, MDB, ''))
cur = con.cursor()
sql_ins = f"SELECT data FROM table1 WHERE OBJ='123'"
cur.execute(sql_ins)
data_new = cur.fetchone()[0]
print(data_new)
try:
sql_ins = f"INSERT INTO table1 (OBJ, data) VALUES ('124', '{data_new}')"
cur.execute(sql_ins)
con.commit()
con.close()
except Exception as ex:
print("ошибка", ex)
con.close()
Вывод:
F:\Python\read_bd\venv\Scripts\python.exe F:/Python/read_bd/main.py
b'?\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
ошибка ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver]COUNT field incorrect (17) (SQLExecDirectW)')
База данных
https://drive.google.com/file/d/17MO1NYVx9bjZcYPcTkQCIJb1gz-Qp0k-/view?usp=sharing
Ответы (1 шт):
Автор решения: Oopss
→ Ссылка
import pyodbc
MDB = "C:\\Users\\Public\\Documents\\db1.mdb"
DRV = '{Microsoft Access Driver (*.mdb, *.accdb)}'
con = pyodbc.connect("DRIVER={};DBQ={};PWD={}".format(DRV, MDB, ''))
cur = con.cursor()
sql_ins = f"SELECT data FROM table1 WHERE OBJ='123'"
cur.execute(sql_ins)
data_new = cur.fetchone()[0]
print(data_new)
try:
sql_ins = f"INSERT INTO table1 (OBJ, data) VALUES ('124', ?)"
cur.execute(sql_ins,(data_new,))
con.commit()
con.close()
except Exception as ex:
print("ошибка", ex)
con.close()
con = pyodbc.connect("DRIVER={};DBQ={};PWD={}".format(DRV, MDB, ''))
cur = con.cursor()
res=cur.execute('select * from table1').fetchall()
print(res)
con.close()
b'?\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
[('123', b'?\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), ('124', b'?\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')]
В запросе ожидалось LONGBINARY, а вставлялась строка. Лучше даже исправить так :
sql_ins = f"INSERT INTO table1 (OBJ, data) VALUES (?, ?)"
cur.execute(sql_ins,('124',data_new))