使用django搭建的网站,已经在django的models中创建了模型,并且已经有数据。
这里需要在后台写server处理后台采集的数据。
使用automap_base获取数据库中已有的表
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
def get_database(host, db_name, user, password):
"""
create existed postgre database engine and get its table with sqlalchemy
:param host:host name, eg:'192.168.8.8'
:param db_name: postgre database's name,eg:'mydatabase'
:param user: postgre database user's name, eg: 'myname'
:param password: postgre databse user's password
:return: db_engine, database engine,can used by sqlalchemy or pandas
tables, database's tables
"""
db_type = "postgres" # postgresql+psycopg2
string = "%s://%s:%s@%s/%s" % (db_type, user, password, host, db_name)
db_engine = create_engine(string, echo=False, client_encoding='utf8')
# get sqlalchemy tables from database
Base = automap_base()
Base.prepare(db_engine, reflect=True)
tables = Base.classes
return db_engine, tables
db_engine, db_table = get_database(host, data_db, user)
db_table的类型为<class 'sqlalchemy.util._collections.Properties'>
,可以通过tables.数据库表名来访问数据库表,比如该数据库中有一个名为device的数据库表,则访问该表的方法为:tab_device = db_table.device
或者tab_device = db_table['device']
。
数据库表数据操作
上面得到的数据库表类实例可用于sqlalchemy的sql查询和orm操作。
sql查询
from sqlalchemy.sql import select
import pandas as pd
selector_device = select([tab_device]).where(tab_device.type_id == device_type)
df_device = pd.read_sql(selector_device, con=engine)
这里的selector_device的类型为:<class 'sqlalchemy.sql.selectable.Select'>
,该类型的查询语句可供pandas的read_sql函数直接使用,将查询结果转换为pd.DataFrame格式。
orm查询
from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=db_engine)()
query_device = session.query(tab_device).filter(tab_device.type_id == device_type)
这里的query_device的类型为<class 'sqlalchemy.orm.query.Query'>
,该类型的查询语句无法供pandas的read_sql使用,原因在于pandas read_sql的sql输入类型为 : string SQL query or SQLAlchemy Selectable (select or text object)to be executed, or database table name.
sql删除
从sqlalchemy sql expression官方教程得到的删除方法应该是这样的:
tab_device.delete().where(...)
但是会报以下错误:
AttributeError: type object 'device' has no attribute 'delete'
sql还有与select相似的delete函数,可以这样引入:
from sqlalchemy.sql import delete
但是没从官方教程看到相关文档,源码封装的比较好,也没找到,时间有限,先放弃。
orm删除
orm删除可以这样实现:
(Pdb) test = session.query(db_table.kindergarten_deviceinfo).filter(db_table.kindergarten_deviceinfo.type_id==100)
(Pdb) test.delete()
然后用session.commit()
提交就可以了。
本来想只用sqlalchemy的sql或者orm,但是现在还不能完全实现功能,等有时间了,研究一下能否实现。