您的位置:首页 > 编程语言 > Python开发

python sqlalchemy的简单用法

2014-07-26 16:43 239 查看
说实在的,至今我还没有完全理解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会实现自动的映射,随后手册上的很多操作都可以正常使用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: