【问题标题】:Oracle with Python - How to check if column already exists?Oracle 与 Python - 如何检查列是否已存在?
【发布时间】:2019-08-08 09:19:46
【问题描述】:

我正在尝试使用 python 从属性列表中创建一个 Oracle 表。可悲的是,我有多个具有相同名称的属性,因此我无法将它们添加到表中。我也不希望我的程序因此而停止。 现在我正在尝试这个解决方案:

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)

我已经粘贴了来自this answer. 的长查询代码。该表是按预期使用第一个属性创建的,但是当我开始添加更多列时,我得到了:

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

我错过了什么?

【问题讨论】:

    标签: python sql database cx-oracle oracle18c


    【解决方案1】:

    我建议简单地构建创建表语句,而不是构建表然后对其进行更改以添加列!

    您可以使用以下代码去除列表中的重复项:

    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 标准的列(包括特殊字符、空格等),这是必需的,但请注意,这也会使名称区分大小写,并且在对表执行任何操作时还需要指定引号。

    【讨论】:

    • 非常感谢,好先生!是的,今天早上我意识到我应该在一个命令中创建整个表之前做好一切准备。感谢 dict.fromkeys 的提示,我用更长、更繁琐的逻辑实现了它,但这个更优雅。
    • 很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多