Python - PySimpleGUI - CX_Oracle - Pandas -传入Oracle语句的输入文本

34gzjxbg  于 2023-02-11  发布在  Python
关注(0)|答案(2)|浏览(162)

我制作了一个简单的Python应用程序,希望将两个文本字段“ID”和“TEXT”传递到Oracle insert语句中。应用程序正确打开,函数似乎正常工作,但这些字段中的inputtext没有传递到Oracle语句中。
Python代码如下;

import PySimpleGUI as sg
import cx_Oracle
import pandas as pd

layout =[
           [sg.Text('Text',size=(10,1)),sg.InputText("", key='-TEXT-')],
           [sg.Button('Submit'),sg.Button('Quit')] ]
         
sg.theme('dark grey 6')
window = sg.Window('Oracle - Test Insert',layout)

event,values = window.read()
if event == 'Submit':
    with cx_Oracle.connect(user="blinx", password="ComCraft8",
                                   dsn="10.10.2.25:1521/ORCL",
                                   encoding="UTF-8") as connection:
        cur=connection.cursor()
        sql = """insert into schema.table (ID, TEXT) values (nextval, ['-TEXT-'])"""
        cur.close()
    
elif event == 'Quit':
    window.close()

尝试此操作,应用程序加载/构建,但未抛出错误,但未插入记录。

lp0sw83n

lp0sw83n1#

最好为所有的Input元素设置键,如'UserName','Password','Hostname','Port','SID','-ID-'和'-TEXT-'(代码中缺少一个破折号),然后您可以通过它们的键获取Input元素的内容,如values['UserName']
语法-以下是MySQL的INSERT INTO语句的语法。
插入到表名(列1,列2,列3,...列N)值(值1,值2,值3,...值N);
以下语句似乎是错误代码,错误值为['-ID-']['-TEXT-']

sql2 = """insert into schema.table (ID, TEXT) values (['-ID-'], ['-TEXT-'])"""
smdncfj3

smdncfj32#

试试这个(用python-oracledb编写,这是cx_Oracle的升级版本,但是可以在下面的代码中用cx_Oracle替换oracledb,它应该仍然可以工作):

import PySimpleGUI as sg
import oracledb

layout =[
           [sg.Text('Text',size=(10,1)),sg.InputText("", key='-TEXT-')],
           [sg.Button('Submit'),sg.Button('Quit')] ]
         
sg.theme('dark grey 6')
window = sg.Window('Oracle - Test Insert',layout)

event,values = window.read()
if event == 'Submit':
    with oracledb.connect(user="blinx", password="ComCraft8",
                          dsn="10.10.2.25:1521/ORCL" as connection:
        sql = """
            insert into schema.table (ID, TEXT)
            values (some_sequence_name.nextval, :1)"""
        bind_values = ['-TEXT-']
        with connection.cursor() as cur:
            cur.execute(sql, bind_values)
    
elif event == 'Quit':
    window.close()

换句话说:

  • 使用绑定变量以确保安全性、性能和易用性
  • 你必须实际调用cursor. execute()来让数据库做一些事情!
  • nextval无效;必须在前面加上序列名

错误ORA-00936表示SQL语句无效,因为存在"缺少表达式"。

相关问题