使用django搭建的網(wǎng)站,已經(jīng)在django的models中創(chuàng)建了模型,并且已經(jīng)有數(shù)據(jù)。
這里需要在后臺寫server處理后臺采集的數(shù)據(jù)。
使用automap_base獲取數(shù)據(jù)庫中已有的表
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.數(shù)據(jù)庫表名來訪問數(shù)據(jù)庫表,比如該數(shù)據(jù)庫中有一個名為device的數(shù)據(jù)庫表,則訪問該表的方法為:tab_device = db_table.device
或者tab_device = db_table['device']
。
數(shù)據(jù)庫表數(shù)據(jù)操作
上面得到的數(shù)據(jù)庫表類實例可用于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函數(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'>
,該類型的查詢語句無法供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(...)
但是會報以下錯誤:
AttributeError: type object 'device' has no attribute 'delete'
sql還有與select相似的delete函數(shù),可以這樣引入:
from sqlalchemy.sql import delete
但是沒從官方教程看到相關(guān)文檔,源碼封裝的比較好,也沒找到,時間有限,先放棄。
orm刪除
orm刪除可以這樣實現(xiàn):
(Pdb) test = session.query(db_table.kindergarten_deviceinfo).filter(db_table.kindergarten_deviceinfo.type_id==100)
(Pdb) test.delete()
然后用session.commit()
提交就可以了。
本來想只用sqlalchemy的sql或者orm,但是現(xiàn)在還不能完全實現(xiàn)功能,等有時間了,研究一下能否實現(xiàn)。