Я не смог воспроизвести вашу ошибку. Чтобы код заработал, мне пришлось поменять местами аргументы Mapper и добавить первичные ключи в определения таблиц. Что еще более важно, мне пришлось установить один из сопоставителей как неосновной после получения этой ошибки:
sqlalchemy.exc.ArgumentError: Class '<class '__main__.MyTable'>' already has a primary
mapper defined. Use non_primary=True to create a non primary Mapper. clear_mappers()
will remove *all* current mappers from all classes.
from sqlalchemy import Table, MetaData, String, Column, create_engine, Integer
from sqlalchemy.orm import mapper
class MyTable(object):
def __init__(self, *args, **kwargs):
[setattr(self, k, v) for k, v in kwargs.items()]
def myfunc1():
engine = create_engine("mysql+pymysql:///test")
metadata = MetaData()
mytable = Table(
"mytable111",
metadata,
Column("id", Integer, primary_key=True),
Column("column1", String(20)),
Column("column2", String(20)),
)
mapper(MyTable, mytable)
metadata.create_all(bind=engine)
def myfunc2():
engine = create_engine("postgresql+psycopg2:///test")
metadata = MetaData()
mytable = Table(
"mytable111",
metadata,
Column("id", Integer, primary_key=True),
Column("column1", String(20)),
Column("column2", String(20)),
Column("column3", String(20)),
)
mapper(MyTable, mytable, non_primary=True)
metadata.create_all(bind=engine)
myfunc1()
myfunc2()
Используя Python3 .8, SQLAlchemy 1.3.10.