python sqlalchemy的简单用法

说实在的,至今我还没有完全理解sqlalchemy的设计思想,前几天想自己在网上抓些东西然后存放在数据库中以便于后续的数据分析,只是不想自己用DB-API写SQL语句去操作数据库,所以才想用ORM的方式,可是看了半天sqlalchemy的文档,都是在讲如何进行建库、建关系等,可是问题是我们经常要操作的数据库,库表的建立并不是通过ORM的方式建,更希望是通过原始的SQL语句去建,这种情况下有没有一种更方便的方式去访问数据库?答案当然是肯定的。


比如我用来抓取基金数据的库中包含两个表:

CREATE TABLE IF NOT EXISTS funds_list (
  fund_code varchar(6) NOT NULL ,
  type_id int DEFAULT NULL,
  fund_name varchar(32)   NOT NULL ,
  fund_origin_date date DEFAULT NULL,
  funds_company_id int DEFAULT NULL,
  comment varchar(256)   DEFAULT NULL,
  PRIMARY KEY (fund_code)
);

CREATE TABLE IF NOT EXISTS funds_value (
  value_data_id bigserial,
  fund_code varchar(6) NOT NULL ,
  value_date date NOT NULL,
  value_curr float DEFAULT NULL ,
  PRIMARY KEY (value_data_id),
  UNIQUE (fund_code, value_date)
);
--
--  外键约束 funds_value
--
ALTER TABLE funds_value
  ADD CONSTRAINT funds_value_ibfk_2 FOREIGN KEY (fund_code) REFERENCES funds_list (fund_code) ON DELETE CASCADE ON UPDATE CASCADE;

用来访问这两个表其实只需要简单构建两个类即可:

# -*- coding=utf-8 -*-
import sqlalchemy
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

if __name__ == "__main__":
    db_user = 'lxq'
    db_pass = 'passwd'
    db_host = 'localhost'
    db_name = 'funds_data'
    engine_str = 'postgres://%s:%s@%s/%s' % (db_user,db_pass,db_host,db_name)
    engine = sqlalchemy.create_engine(engine_str)

    metadata = sqlalchemy.Metadata(bind = engine)
    Base = declarative_base(metadata)

    Session = sessionmaker(bind=engine)
    session = Session()

    # 关键在下面这两个类的定义,不需要针对每个数据项单独定义一个类的列,即能
    # 够实现简单的ORM映射。
    class Funds_list(Base):
        __table__ = Table('funds_list', metadata, autoload=True)
    class Funds_value(Base):
        __table__ = Table('funds_value', metadata, autoload = True)

    # 查询操作
    result = session.query(Funds_value.value_data_id).filter(
                Funds_value.fund_code == '350005',
                Funds_value.value_date == '20140714').all()

    # 插入操作
    item = Fund_List(fund_code = '350005', fund_name = u'天治创新先锋')
    session.add(item)
    session.commit()

简单定义了两个类之后,不用关心数据表的内部实现,sqlalchemy会实现自动的映射,随后手册上的很多操作都可以正常使用了。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值