#python #sql #oracle
Вопрос:
Я собираюсь вставить данные в таблицу, которая в Oracle используется python. Это не дало мне никакой ошибки, но и ничего не добавило в мою таблицу в Oracle SQL Developer. Также я написал запрос, чтобы получить select в моей таблице в среде python, это дало мне результат.
Мой CREATE TABLE
код:
cursor = conn.cursor()
cursor.execute("CREATE TABLE INSERT_TEST(FISRT_COLUMN VARCHAR2(30),SECOND_COLUMN NUMBER(10,2))")
Мой INSERT
код:
cursor = conn.cursor()
data = [
('Mina', 20),
('Minoo', 32),
('Sara', 22),
('Ehssan', 25),
('Ladan', 55)
]
for row in data:
cursor.execute("""
insert into INSERT_TEST (FISRT_COLUMN, SECOND_COLUMN)
values (:1, :2)""", row)
Мой SELECT
вопрос:
re = cursor.execute("select * from INSERT_TEST")
for row in re:
print(row)
Мои выходные данные в среде python:
('Mina', 20.0) ('Minoo', 32.0) ('Sara', 22.0) ('Ehssan', 25.0) ('Ladan', 55.0)
Мои выходные данные в Oracle SQL Developer пусты!
Комментарии:
1. Oracle SQL Developer-это бесплатная интегрированная среда разработки . Таблица отсутствует в среде IDE, это объект базы данных. Чтобы сделать ваши изменения постоянными в SQL, вам необходимо зафиксировать их в конце сеанса.
2. Я ставил
commit;
это раньше, но это дает мнеname 'commit' is not defined
ошибку.3. Помимо проблемы, вам лучше использовать
cursor.executemany(stmt, list)
вместо цикла, так как он питонический и более быстрый4. Но ваш код не содержит
commit
5. здесь нет, я уже говорил раньше. Я удаляю фиксацию; это дало мне ошибку, и я написал ошибку, затем я удаляю это и задаю свою проблему здесь.
Ответ №1:
Я понимаю, что это зависит от таблицы в oracle SQL developer, конца моего кода, который я должен написать cursor.execute('commit')
, чтобы показать, что он заканчивается, и вставить все данные в мою таблицу.
Ответ №2:
Я думаю, что вам нужно conn.commit()
в конце вашей программы. commit
принадлежит к connection
классу, а не к cursor
своему .
Ответ №3:
Проверьте документацию для драйвера вашей базы данных.
- Для некоторых драйверов баз данных поведение по умолчанию
COMMIT
связано с любыми незафиксированными данными при закрытии транзакции и соединения; поэтому убедитесь, что вы закрыли соединение после завершения. - Для других драйверов баз данных поведение по умолчанию относится к
ROLLBACK
любым незафиксированным данным при закрытии транзакции и соединения; в этом случае вам потребуется явноCOMMIT
указать данные перед закрытием соединения, иначе это приведетROLLBACK
к вашим изменениям.
База данных Oracle не пускает других сеансов (даже принадлежащих одному и тому же пользователю) видеть незафиксированные данные, поэтому, если вы INSERT
из Python, но не COMMIT
(прямо или, если драйвер поддерживает это, неявно, когда вы закрываете соединение), то вы сможете видеть его у питона сессии, где был создан данных, но это будет скрыто, когда вы просматриваете его в другом сеансе (т. е. от разработчика SQL).