使用sqlalchemy处理已有的数据库

使用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,但是现在还不能完全实现功能,等有时间了,研究一下能否实现。

    原文作者:学以致用123
    原文地址: https://www.jianshu.com/p/ee4a9fa952c0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞