
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(新字符串)。 |