Oracle с Python - Как проверить, существует ли уже столбец? - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь создать таблицу Oracle из списка атрибутов с помощью Python. К сожалению, у меня есть несколько атрибутов с одним и тем же именем, поэтому я не могу добавить их в таблицу. Также я не хочу, чтобы моя программа остановилась из-за этого. Сейчас я пытаюсь с этим решением:

connection = cx_Oracle.connect('user/password')
cursor = connection.cursor()

if not tableExists(connection, 'TableName'):
first_column_name = next(iter(attributes), None)
query_table = 'CREATE TABLE TableName ("{}" VARCHAR2(255))'.format(first_column_name)
cursor.execute(query_table)


for attribute in attributes[1:]:
    query_column= '''
    DECLARE
        v_column_exists number := 0;  
    BEGIN
        Select count(*) into v_column_exists
            from user_tab_cols
            where upper(column_name) = "{}"
            and upper(table_name) = 'TableName';

        if (v_column_exists = 0) then
            execute immediate 'alter table TableName add ("{}" VARCHAR2(255)))';
        end if;
    end;
    '''.format(attribute, attribute)

    cursor.execute(query_column)

Я вставил длинный код запроса из этого ответа. Таблица создана с первым атрибутом, как и предполагалось, но по мере добавления новых столбцов я получаю:

Traceback (most recent call last):
File "main.py", line 52, in <module>
cursor.execute(query_column)
cx_Oracle.DatabaseError: ORA-06550: line 7, column 41:
PL/SQL: ORA-00904: "Order count [A221]": invalid identifier
ORA-06550: line 5, column 9:
PL/SQL: SQL Statement ignored

Чего мне не хватает?

1 Ответ

2 голосов
/ 19 марта 2019

Я бы предложил просто создать оператор create table вместо построения таблицы и затем изменить ее, чтобы добавить к ней столбцы!

Вы можете избавиться от дубликатов в списке, используя следующий код:

listWithoutDups = list(dict.fromkeys(listWithDups))

Затем вы можете построить свое утверждение следующим образом:

columns = ['"%s" varchar2(255)' % n for n in listWithoutDups]
sql = "create table SomeTableName (%s)" % ",".join(columns)
cursor.execute(sql)

Вы заметите, что я включил двойные кавычки вокруг имен столбцов - это необходимо, если вы хотите создать столбцы, которые не соответствуют стандартам Oracle (включая специальные символы, пробелы и т. Д.), Но имейте в виду, что также делает имена чувствителен к регистру, и вам нужно будет также указывать кавычки при выполнении каких-либо операций с таблицей.

...