sqlor/sqlor/sqliteor.py
2025-10-31 08:35:53 +08:00

146 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding:utf8 -*-
import aiosqlite
from appPublic.argsConvert import ArgsConvert, ConditionConvert
from .sor import SQLor
from .ddl_template_sqlite import sqlite_ddl_tmpl
class SQLiteor(SQLor):
ddl_template = sqlite_ddl_tmpl
db2modelTypeMapping = {
'integer': 'long',
'int': 'long',
'tinyint': 'short',
'smallint': 'short',
'mediumint': 'long',
'bigint': 'long',
'decimal': 'float',
'numeric': 'float',
'real': 'float',
'double': 'float',
'float': 'float',
'char': 'char',
'varchar': 'str',
'text': 'text',
'clob': 'text',
'blob': 'bin',
'date': 'date',
'datetime': 'datetime',
'boolean': 'short',
}
model2dbTypemapping = {
'date': 'date',
'time': 'time',
'timestamp': 'datetime',
'str': 'text',
'char': 'char',
'short': 'integer',
'long': 'integer',
'float': 'real',
'text': 'text',
'bin': 'blob',
'file': 'blob',
}
@classmethod
def isMe(cls, name):
return name.lower() in ['sqlite', 'sqlite3']
def grammar(self):
return {
'select': 'select',
}
def placeHolder(self, varname, pos=None):
"""SQLite 使用 ? 占位符"""
if varname == '__mainsql__':
return ''
return '?'
def dataConvert(self, dataList):
if isinstance(dataList, dict):
return tuple(dataList.values())
else:
return tuple(i['value'] for i in dataList)
def pagingSQLmodel(self):
"""分页 SQL 模板"""
return """select * from (%s) as A order by $[sort]$ limit $[rows]$ offset $[from_line]$"""
def tablesSQL(self):
"""获取表名和备注"""
sqlcmd = """
SELECT
lower(name) AS name,
'' AS title
FROM sqlite_master
WHERE type='table'
AND name NOT LIKE 'sqlite_%';
"""
return sqlcmd
def fieldsSQL(self, tablename=None):
"""获取字段信息"""
sqlcmd = f"""
PRAGMA table_info({tablename});
"""
# SQLite 无信息架构表,直接返回 PRAGMA 命令
return sqlcmd
def fkSQL(self, tablename=None):
"""获取外键信息"""
if tablename:
sqlcmd = f"PRAGMA foreign_key_list({tablename});"
else:
sqlcmd = "-- SQLite 需逐表获取外键信息"
return sqlcmd
def pkSQL(self, tablename=None):
"""获取主键信息"""
sqlcmd = f"""
SELECT name
FROM pragma_table_info('{tablename}')
WHERE pk != 0;
"""
return sqlcmd
def indexesSQL(self, tablename=None):
"""获取索引信息"""
if not tablename:
return "SELECT name as index_name, '' as is_unique, '' as column_name FROM sqlite_master WHERE type='index';"
sqlcmd = f"""
PRAGMA index_list('{tablename}');
"""
return sqlcmd
async def connect(self):
"""
连接 SQLite 数据库
dbdesc:
path: 数据库文件路径(或 :memory:
"""
dbdesc = self.dbdesc
self.dbpath = dbdesc.get('path', ':memory:')
self.conn = await aiosqlite.connect(self.dbpath)
self.conn.row_factory = aiosqlite.Row # 支持 dict 访问
self.dbname = self.dbpath
async def close(self):
await self.conn.close()
async def enter(self):
"""开启事务"""
self.cur = await self.conn.cursor()
async def exit(self):
"""释放 cursor"""
try:
await self.cur.close()
except:
pass
self.cur = None