Python Flask 动态database 动态表 查询及原生sql文

本文介绍了如何使用Python的SQLAlchemy库动态创建表和数据库连接,以及如何在Flask应用中进行指定字段的查询。通过`type`函数创建自定义模型,同时展示了如何调整`GROUP_CONCAT`的配置以处理大数据量的字段合并。
摘要由CSDN通过智能技术生成

下面是操作代码

    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;"))

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值