使用django搭建的網(wǎng)站幻馁,已經(jīng)在django的models中創(chuàng)建了模型庇配,并且已經(jīng)有數(shù)據(jù)。
這里需要在后臺(tái)寫server處理后臺(tái)采集的數(shù)據(jù)尊残。
使用automap_base獲取數(shù)據(jù)庫(kù)中已有的表
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'>
炒瘸,可以通過(guò)tables.數(shù)據(jù)庫(kù)表名來(lái)訪問數(shù)據(jù)庫(kù)表淤堵,比如該數(shù)據(jù)庫(kù)中有一個(gè)名為device的數(shù)據(jù)庫(kù)表,則訪問該表的方法為:tab_device = db_table.device
或者tab_device = db_table['device']
什燕。
數(shù)據(jù)庫(kù)表數(shù)據(jù)操作
上面得到的數(shù)據(jù)庫(kù)表類實(shí)例可用于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'>
,該類型的查詢語(yǔ)句可供pandas的read_sql函數(shù)直接使用屎即,將查詢結(jié)果轉(zhuǎn)換為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'>
,該類型的查詢語(yǔ)句無(wú)法供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官方教程得到的刪除方法應(yīng)該是這樣的:
tab_device.delete().where(...)
但是會(huì)報(bào)以下錯(cuò)誤:
AttributeError: type object 'device' has no attribute 'delete'
sql還有與select相似的delete函數(shù)乘陪,可以這樣引入:
from sqlalchemy.sql import delete
但是沒從官方教程看到相關(guān)文檔,源碼封裝的比較好雕擂,也沒找到啡邑,時(shí)間有限,先放棄井赌。
orm刪除
orm刪除可以這樣實(shí)現(xiàn):
(Pdb) test = session.query(db_table.kindergarten_deviceinfo).filter(db_table.kindergarten_deviceinfo.type_id==100)
(Pdb) test.delete()
然后用session.commit()
提交就可以了谤逼。
本來(lái)想只用sqlalchemy的sql或者orm,但是現(xiàn)在還不能完全實(shí)現(xiàn)功能仇穗,等有時(shí)間了流部,研究一下能否實(shí)現(xiàn)。