Base = declarative_base()
engine = create_engine("mysql+pymysql://root:[email protected]:3306/testcreattbl?charset=utf8",echo=False)
Session = sessionmaker(bind=engine)
session = Session()
metadata = MetaData(engine)
class tbl_Items(Base):
__tablename__ = 'Item2017'
id = Column(INTEGER(64), primary_key=True)
类型 = Column(String(8))
序号 = Column(SMALLINT())
变化时间 = Column(DateTime)
重量 = Column(DECIMAL(6, 3))
长 = Column(DECIMAL(6, 3))
宽 = Column(DECIMAL(6, 3))
高 = Column(DECIMAL(6, 3))
UpdateTime = Column(DateTime)
SQLTAG = Column(String(20))
__table_args__ = ({'comment': '[ItemsXXX]'})
class tbl_apple(Base):
#省略
class tbl_banana(Base):
#省略
ret = engine.dialect.has_table(engine, 'Item2020')
if not ret:
tbl_Items.__tablename__ = ''Item2020"
# 这里如何创建一张"Item2020"的表?(同结构 class tbl_Items)
假如我用了 base.metadata.create_all(engine)
testcreattbl 将会其它无关的 tbl_apple,tbl_banana 表都创建了。。。
1
iConnect 2020-08-01 22:26:07 +08:00 via Android
base 本来就是公用的抽出来,你不复用的如果加判断(不知道 sqlalchemy 是不是支持)来处理,还不如在子类里单独写的
|
2
pppguest3962 OP @iConnect ”子类里单独写?“,没能理解这个意思。。。。。,继承了一个子类,如何用这个子类建表呢?
|
3
siteshen 2020-08-02 15:58:15 +08:00
你调用 `create_all` 函数,当然会 `create all`了。你不指定,`create_all` 怎么知道你想排除哪些表呢。
|
4
yzk66880 2020-08-02 22:36:04 +08:00
啥叫模板化建表? 嫌 create_all 的方式不灵活的话 就 alembic 做表管理
|
5
pppguest3962 OP 谢谢各位,
ORM 这种映射方式应该是不能直接这么做, 我用了另外一个方式,用 CrateTable(),获取旧表的原生 sql create 语句成 string 字符串,字符串修改新表名,再 conn.execute(新字符串)。 |