sql-server - 如何使用经典映射在 SQLAlchemy 中重新定义具有相同名称的表
问题描述
我正在使用 SQLAlchemy经典映射来定义具有相同名称但不同列的表,具体取决于数据库,我已经按照文档中的说明映射了该类,但是每次尝试为另一个数据库重新定义该类时都会出错. 例如:
from sqlalchemy import (Table, MetaData, String, Column)
from sqlalchemy.orm import mapper
class MyTable(object):
def __init__(self, *args, **kwargs):
[setattr(self, k, v) for k, v in kwargs.items()]
default_cols = (
Column('column1', String(20), primary_key=True),
Column('column2', String(20))
)
def myfunc1():
engine = create_engine('connection_to_database1')
session = sessionmaker(bind=engine)()
metadata = MetaData()
mytable = Table('mytable', metadata, *default_cols)
mapper(MyTable, mytable)
metadata.create_all(bind=engine)
def myfunc2():
engine = create_engine('connection_to_database2')
session = sessionmaker(bind=engine)()
metadata = MetaData()
columns = list(default_cols) + [Column('column3', String(20))]
mytable = Table('mytable', metadata, *columns)
mapper(MyTable, mytable)
metadata.create_all(bind=engine)
myfunc1()
myfunc2()
我得到的错误:
Column object 'column1' already assigned to Table 'mytable'
如果我使用完全不同的 MetaData 和引擎实例,会发生什么情况?有没有办法做到这一点?
解决方案
使用default_cols变量实际上是问题所在,除非在每个函数上单独定义列,否则这种设置似乎不起作用:
def myfunc1():
engine = create_engine('connection_to_database1')
session = sessionmaker(bind=engine)()
metadata = MetaData()
mytable = Table('mytable', metadata,
Column('column1', String(20), primary_key=True),
Column('column2', String(20))
)
mapper(MyTable, mytable)
metadata.create_all(bind=engine)
def myfunc2():
engine = create_engine('connection_to_database2')
session = sessionmaker(bind=engine)()
metadata = MetaData()
columns = [
Column('column1', String(20), primary_key=True),
Column('column2', String(20),
Column('column3', String(20))
]
mytable = Table('mytable', metadata, *columns)
mapper(MyTable, mytable)
metadata.create_all(bind=engine)
否则会引发异常:
Column object 'column1' already assigned to Table 'mytable'
推荐阅读
- javascript - 如何在我的点击功能后弹出警报(表单 JavaScripy&JQuery - 作业项目)
- reactjs - Carbon::createFromFormat '找不到两位数的日期'
- bash - 逐行读取文件的 Bash 脚本已在一夜之间停止运行
- google-api - 过滤 Google 课堂 SDK -> listCoursesAnnouncements where itemDate > Today
- prolog - 函子作为Prolog中的变量
- c++ - 在 C++ 的 getter 中使用 const
- angular - 监听 DOM 变化
- android - Flutter MissingPluginException(在通道 flutter.baseflow.com/permissions/methods 上找不到方法 init 的实现)
- django - Django - html 提交以查看对 html 页面的 api 调用
- python - -bash: /shared/conda/bin/python3: 没有这样的文件或目录