Форум сайта python.su
Всем привет. Пытаюсь с помощью python сделать insert записей в таблицу Oracle. Скрипт отрабатывает, но никаких записей не появляется. Уже перепробовала кучу вариантов, никак не получается.
con = cx_Oracle.connect('user/pass@127.0.0.1/mybase') cur = con.cursor() example = { "id": "8", "name": "example", "datatim": datetime.datetime.now() } cur.execute ( "insert into table (ID_FILE, NAME_FILE, SYS_CREATION_DATE) values (:id, :name, :datatim)", example ) con.commit() cur.close() con.close()
Офлайн
А так сработает?
example = { ":id": "8", ":name": "example", ":datatim": datetime.datetime.now() }
Офлайн
ZlobnayaPechenkaПопробуй обернуть:"datatim": datetime.datetime.now()
str(datetime.datetime.now())
Офлайн
FishHook
А так сработает?
py.user.next
str(datetime.datetime.now())
Офлайн
Вот так точно должно сработать, иначе у вас где-то не в этом месте проблемы
example = [8, "example", datetime.datetime.now()] cur.execute ( "insert into table (ID_FILE, NAME_FILE, SYS_CREATION_DATE) values (%s, %s, %s)", example )
Офлайн
ZlobnayaPechenkaНо подавать нужно всё равно строку, а при взаимодействии с базой она преобразует её. Потому что модуль для работы с базой данных не знает о модуле для работы с датой-временем.
В базе эта колонка имеет значение date
Офлайн
py.user.nextcx_Oracle сам знает, как ему преобразовывать дату в строку, ровно как и другие типы данных. Клиента это вообще не должно интересовать. Уверяю вас, вы не правы.
Но подавать нужно всё равно строку, а при взаимодействии с базой она преобразует её. Потому что модуль для работы с базой данных не знает о модуле для работы с датой-временем.
Офлайн
FishHookПосмотрел исходники, он там соединён с datetime напрямую. Лучше, конечно, через простой текст связывать (связывание по данным), иначе возникает связывание по формату и изменение datetime повлечёт изменение cx_Oracle.
cx_Oracle сам знает, как ему преобразовывать дату в строку
Отредактировано py.user.next (Май 13, 2015 13:42:33)
Офлайн
Пробовала делать инсерт в другую таблицу, по шаблону
create table mytab (id number, data varchar2(20));
import cx_Oracle con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl') rows = [ (1, "First" ), (2, "Second" ), (3, "Third" ), (4, "Fourth" ), (5, "Fifth" ), (6, "Sixth" ), (7, "Seventh" ) ] cur = con.cursor() cur.bindarraysize = 7 cur.setinputsizes(int, 20) cur.executemany("insert into mytab(id, data) values (:1, :2)", rows) con.commit() cur.close() сon.close()
create table "table" (ID_FILE number(5) constraint "FILE_ID" primary key, NAME_FILE varchar2(256) "SYS_CREATION_DATE" DATE CONSTRAINT "SYS_CREATION_DATE_NN" NOT NULL ENABLE);
Офлайн
ZlobnayaPechenka
А не проще все-таки глянуть в сторону какого-нибудь ОРМ. В этом случае всю ответственность за соответствие типам берет на себя он. Плюс решение будет платформонезависимым, т.е. с изменением базы можно будет менять только коннектор, а это одна строка
Офлайн