Python Sqlalchemy-核心-创建现有表的副本
我需要基于同一(Oracle)模式中的现有表创建一个表。我不希望对新表有任何约束,即使原始表可能有一个或多个约束 我尝试使用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
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
调用安全地执行此操作
我知道我不应该为了创建一个具有原始表定义的新表而做所有这些,但现在,这似乎可行。当然可以。但我得等两天才能接受。当然可以。但我要等两天才能接受。