下面是操作代码
def selectByTable(tableName,databaseName): __tablename__ = tableName # 注意:要和SQLALCHEMY_BINDS里的key相同 __bind_key__ = databaseName __table_args__ = { 'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_0900_ai_ci', 'mysql_comment': 'xxxx', # 解决SQLAlchemy的表和meta重复绑定问题 "extend_existing": True } # 字段列表 date = db.Column(BIGINT(unsigned=True), primary_key=True, comment='当前日期') open = db.Column(DOUBLE(unsigned=True), comment='当天开xxxx') high = db.Column(DOUBLE(unsigned=True), comment='当天最xxxx') # 构建属性列表 properties = { "__tablename__": __tablename__, "__bind_key__": __bind_key__, "__table_args__": __table_args__, "date": date, "high": high, "open": open } # 动态创建模型并返回 model = type(__tablename__, (db.Model,), properties) return model
利用__tablename__ , __bind_key__来实现动态表和动态database
然后利用type方法创建动态模型
type方法可以返回一个类,参数如下:
- 第一个参数是类的名字,这里我使用了表名,防止调试出错;
- 第二个参数是这个类的父类元组,单类继承别忘了加括号。这里我继承了db.Model;
- 第三个参数是属性字典,包括字段和方法
type作用是创建一个名为__tablename__的类,该类继承自db.Model,并且具有properties中定义的属性和方法。
当完成上面的代码后,在你的service层,调用可以指使用 :
dynamicTable = DynamicTable.selectByTable(table_name, database_name)
dynamicDetail = dynamic_table_name.query.filter().all()
#转换成json字符串
json_data = json.dumps([{
'close': result.close,
'open': result.open,
'tscode': item.ts_code
} for result in dynamicDetail ], cls=DecimalEncoder, ensure_ascii=False)
#response 返回并且使用json.loads 转换成json对象
response_object = {
'status': 'success',
'message': 'successfully.',
'data': json.loads(json_data)
}
原生sql :
engine = create_engine("mysql://root:oms@192.168.2.75:3306/ns_sh_day_ts", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = Session()
result = session.execute(text("select * from ns_sh_day_ts.000001 where date = '20000607'")).fetchall()
如果你的config文件已经定义好了,请直接使用
result = db.session.execute(
text("select * from ns_sh_day_ts.000001 where date = '20000607'")).
fetchall()
问题:
如果你想用Flask实现 指定的字段进行检索,并只返回指定字段的数据
可以使用.with_entities()指定返回的字段
dynamic_detail = (dynamic_table_name.query.
with_entities(dynamic_table_name.close,dynamic_table_name.open,dynamic_table_name.date).
order_by(dynamic_table_name.date.desc()).limit(2).all())
打印的sql文:
SELECT
`000034`.close AS `000034_close`,
`000034`.open AS `000034_open`,
`000034`.date AS `000034_date`
FROM `000034` ORDER BY `000034`.date DESC
LIMIT %s
如果想检索的字段拼接成一个字符,然后逗号分隔,可以使用GROUP_CONCAT
SELECT
GROUP_CONCAT(column_name SEPARATOR ',') AS concatenated_string
FROM table_name;
但是GROUP_CONCAT的group_concat_max_ len
的默认值为1024
可以使用下面例子,设置数据库
SET SESSION group_concat_max_len = 16384;
或者偷个懒 运行你的sql前执行下面代码:
db.session.execute(text("SET SESSION group_concat_max_len = 16384;"))