Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sqlalchemy-核心-创建现有表的副本_Python_Oracle_Sqlalchemy - Fatal编程技术网

Python Sqlalchemy-核心-创建现有表的副本

Python Sqlalchemy-核心-创建现有表的副本,python,oracle,sqlalchemy,Python,Oracle,Sqlalchemy,我需要基于同一(Oracle)模式中的现有表创建一个表。我不希望对新表有任何约束,即使原始表可能有一个或多个约束 我尝试使用column.copy()从原始表创建新表,但由于某些原因,在数据库中创建新表后无法删除约束 def clone_table_approach_1(original_table, connection, metadata): try: new_table_name = original_table.name + '_sync' col

我需要基于同一(Oracle)模式中的现有表创建一个表。我不希望对新表有任何约束,即使原始表可能有一个或多个约束

我尝试使用
column.copy()
从原始表创建新表,但由于某些原因,在数据库中创建新表后无法删除约束

def clone_table_approach_1(original_table, connection, metadata):
    try:
        new_table_name = original_table.name + '_sync'
        columns = [c.copy() for c in original_table.columns]
        new_table = Table(new_table_name, metadata, quote=False, *columns)

        # Create table in database
        if not new_table.exists():
            new_table.create()
        else:
            raise Exception("New table already exists")

        # Remove constraints from new table if any
        for constraint in new_table.constraints:
            connection.execute(DropConstraint(constraint))

        # Return table handle for newly created table
        final_cloned_table = Table(new_table, metadata, quote=False)
        return final_cloned_table

    except:
        # Drop if we did create a new table
        if new_table.exists():
            new_table.drop()
        raise
这在删除约束时失败。sqlalchemy似乎不知道在数据库中的新表上创建的约束的名称。我可以看到具有约束名称的新表,如“SYS_C00450822”和“SYS_C00450823”(这些不是空检查约束)

例外情况:

Traceback (most recent call last):
  File "/home/gaurav/myprojects/python/sync/test_table_copy.py", line 163, in <module>
    t_product_new = clone_table_approach_1(t_product, target_conn, target_metadata)
  File "/home/gaurav/myprojects/python/sync/test_table_copy.py", line 57, in clone_table_approach_1
    connection.execute(DropConstraint(constraint))
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/engine/base.py", line 729, in execute
    return meth(self, multiparams, params)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/ddl.py", line 69, in _execute_on_connection
    return connection._execute_ddl(self, multiparams, params)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/engine/base.py", line 777, in _execute_ddl
    compiled = ddl.compile(dialect=dialect)
  File "<string>", line 1, in <lambda>
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/elements.py", line 493, in compile
    return self._compiler(dialect, bind=bind, **kw)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/ddl.py", line 27, in _compiler
    return dialect.ddl_compiler(dialect, self, **kw)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/compiler.py", line 199, in __init__
    self.string = self.process(self.statement, **compile_kwargs)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/compiler.py", line 222, in process
    return obj._compiler_dispatch(self, **kwargs)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/visitors.py", line 80, in _compiler_dispatch
    return meth(self, **kw)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/compiler.py", line 2518, in visit_drop_constraint
    self.preparer.format_constraint(drop.element),
  File "<string>", line 1, in <lambda>
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/compiler.py", line 2928, in format_constraint
    return self.quote(constraint.name)
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/compiler.py", line 2893, in quote
    if self._requires_quotes(ident):
  File "/home/gaurav/.local/lib/python3.4/site-packages/sqlalchemy/sql/compiler.py", line 2864, in _requires_quotes
    lc_value = value.lower()
AttributeError: 'NoneType' object has no attribute 'lower'
回溯(最近一次呼叫最后一次):
文件“/home/gaurav/myprojects/python/sync/test_table_copy.py”,第163行,在
t_产品\u新=克隆表\u方法\u 1(t_产品、目标连接、目标元数据)
文件“/home/gaurav/myprojects/python/sync/test_table_copy.py”,第57行,在clone_table_approach_1中
connection.execute(DropConstraint(constraint))
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/engine/base.py”,执行中的第729行
返回方法(自身、多线程、参数)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/ddl.py”,第69行,在连接上执行
返回连接。_执行_ddl(self、multiparams、params)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/engine/base.py”,第777行,在_execute_ddl中
compiled=ddl.compile(方言=方言)
文件“”,第1行,在
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/elements.py”,第493行,编译中
返回self.\u编译器(方言,bind=bind,**kw)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/ddl.py”,第27行,在编译器中
返回方言.ddl_编译器(方言,self,**kw)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/compiler.py”,第199行,在__
self.string=self.process(self.statement,**compile_-kwargs)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/compiler.py”,第222行,正在处理中
返回对象\u编译器\u分派(自身,**kwargs)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/visitors.py”,第80行,在编译器调度中
返回方法(自身,**千瓦)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/compiler.py”,第2518行,在访问\删除\约束中
self.preparer.format_约束(drop.element),
文件“”,第1行,在
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/compiler.py”,第2928行,格式为
返回self.quote(constraint.name)
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/compiler.py”,第2893行,在引号中
如果self.\u需要\u引号(标识):
文件“/home/gaurav/.local/lib/python3.4/site packages/sqlalchemy/sql/compiler.py”,第2864行,需要引号
lc_value=value.lower()
AttributeError:“NoneType”对象没有属性“lower”

还有其他更好的方法吗?

看来我已经解决了自己的问题

原始表有三个“NOTNULL”约束(未明确命名,因此它们被命名为“
SYS\u C00450822
”等),还有一个PK约束(命名为,比如说,“table\u PK”)

当我仅使用原始表中的列创建副本时,但不使用约束,新表是使用4个约束创建的,所有约束都使用系统生成的名称,如“SYS_C00450822”

在删除约束时,sqlalchemy没有得到约束的任何“名称”,正如问题中所提到的,这导致了第
lc_value=value.lower()
行出现问题,因为该值(我认为是“名称”)为空,为非类型

因此,我修改了代码,从原始表中创建了带有约束的新表(但重命名了约束的名称,以便它不会与现有的原始表约束冲突)

这以相同的方式创建了三个“NOTNULL”检查约束,但是PK约束现在是用名称定义的,比如“TABLE_PK_2”

然后通过
DropConstraint
调用安全地执行此操作


我知道我不应该为了用原始表定义创建一个新表而这么做,但现在,这似乎可行。

看起来我已经解决了我自己的问题

原始表有三个“NOTNULL”约束(未明确命名,因此它们被命名为“
SYS\u C00450822
”等),还有一个PK约束(命名为,比如说,“table\u PK”)

当我仅使用原始表中的列创建副本时,但不使用约束,新表是使用4个约束创建的,所有约束都使用系统生成的名称,如“SYS_C00450822”

在删除约束时,sqlalchemy没有得到约束的任何“名称”,正如问题中所提到的,这导致了第
lc_value=value.lower()
行出现问题,因为该值(我认为是“名称”)为空,为非类型

因此,我修改了代码,从原始表中创建了带有约束的新表(但重命名了约束的名称,以便它不会与现有的原始表约束冲突)

这以相同的方式创建了三个“NOTNULL”检查约束,但是PK约束现在是用名称定义的,比如“TABLE_PK_2”

然后通过
DropConstraint
调用安全地执行此操作


我知道我不应该为了创建一个具有原始表定义的新表而做所有这些,但现在,这似乎可行。

当然可以。但我得等两天才能接受。当然可以。但我要等两天才能接受。