import sqlite3
# *********************************** ****************
# *
# * 説明: PythonoperSQLite3数据库辅助类(查询构造器)
# * 著者: wangye
# *
# ******************************************* *******
def _wrap_value(value):
return repr(value)
def _wrap_values(values):
return list(map(_wrap_value,values) ))
def _wrap_fields(fields):
field.items() のキー、値:
field[key] = _wrap_value(value)
フィールドを返します
def _concat_keys(keys):
return "[" + "],[".join(keys) + "]"
def _concat_values(values):
return ",".join (値)
def _concat_fields(fields, 演算子 = (なし, ",")):
if 演算子:
unit_operator, group_operator = 演算子
# フィールド = _wrap_fields(fields)
dedicated = []
for key,value in field.items():
COMPLETE.append("[" + key + "]")
ifunit_operator:
compiled.append( unit_operator)
Compiled.append(value)
Compiled.append(group_operator)
Compiled.pop() # 最後の group_operator
return " ".join(compiled)
class DataCondition(object):
"""
SQL 構築ツールの操作に使用される本種の条件句部分
例:
DataCondition(("=", "AND") 、 id = 26)
DataCondition(("=", "AND"), True, id = 26)
"""
def __init__(self, 演算子 = ("=", "AND")、ingroup = True、**kwargs):
"""
造法
パラメータ:
演算子演算子、分別(表达式演算子、条件运算符)
ingroup 否か分组、如果分组、包含
kwargs 键值元组、データテーブルの列名および值
注意ここにある等号は SQL 生成 SQL 句シンボル
实际シンボル是由operator[0]制御的
例:
DataCondition(("=, "AND"), id = 26)
(id=26)
DataCondition((">" , "OR"), id = 26, age = 35)
(id>26 OR age>35)
DataCondition(("LIKE", "OR"), False, name = "John", company = "Google")
「John」のような名前、または「Google」のような会社
"""
self.ingroup = ingroup
self.fields = kwargs
self.operator = Operator
def __unicode__(self):
self.fields = _wrap_fields(self.fields)
result = _concat_fields(self.fields, self.operator)
if self.ingroup:
return "(" + result + ")"
return result
def __str__(self):
return self.__unicode__()
def toString(self):
return self.__unicode__()
class DataHelper(object):
"""
SQLite3 データクエリ補助クラス
"""
def __init__(self, filename):
"""
コンストラクター メソッド
パラメーター: filename は SQLite3 データベース ファイル名です
"""
self.file_name = filename
def open(self):
" ""
データベースを開いてカーソルを設定します
“""
self.connection = sqlite3.connect(self.file_name)
self.cursor = self.connection.cursor()
return self
def close(self):
"" "
" hasattr(self、 "connection")and self.connection:
self.connection.close()cleanup work
commit_at_once が True に設定されている場合、このメソッドは暗黙的に呼び出されます。
それ以外の場合、このメソッドは明示的に呼び出される必要があります。 (self, sql = None, commit_at_once = True):
"""
SQL ステートメントを実行します
パラメーター:
実行される SQL ステートメント。None の場合、コンストラクターはデバイスと呼ばれます。 SQL ステートメント。
commit_at_once トランザクションをすぐにコミットするかどうか。すぐにコミットしない場合は、
クエリ以外の操作の場合は、明示的に commit を呼び出してコミットする必要があります。
""
if not sql:
sql = self.sql
self.cursor.execute(sql)
if commit_at_once:
self.commit()
def fetchone(self, sql = None):
"""
取一条记录
""
self.execute(sql, False)
return self.cursor.fetchone ()
def fetchall(self, sql = None):
"""
取所有记录
"""
self.execute(sql, False)
return self.cursor.fetchall()
def __concat_keys(self,keys):
return _concat_keys(keys)
def __concat_values(self,values):
return _concat_values(値)
def table(self, *args):
"""
設置查询的表、多个表名用逗号分間隔
"""
self.tables = args
self.tables_snippet = self.__concat_keys(self.tables)
return self
def __wrap_value(self, value):
return _wrap_value(value)
def __wrap_values(self,values):
return _wrap_values(values)
def __wrap_fields(self, field):
return _wrap_fields(fields)
def __where(self):
#self.condition_snippet
if hasattr(self、 "condition_snippet"):
self.where_snippet = " + self.condition_snippet
def __select(self):
テンプレート= "SELECT %(keys)s FROM %(tables)s"
body_snippet_fields = {
「テーブル」 : self.tables_snippet,
「キー」 : self.__concat_keys(self.body_keys),
}
self.sql = template % body_snippet_fields
def __insert(self):
template = "INSERT INTO %(tables)s (%(keys)s) VALUES (%(values) s)"
body_snippet_fields = {
"テーブル" : self.tables_snippet,
"キー" : self.__concat_keys(list(self.body_fields.keys())),
"値" : self.__concat_values(list(self.body_fields.values()))
}
self.sql = template % body_snippet_fields
def __update(self):
template = "UPDATE %( tables)s SET %(fields)s"
body_snippet_fields = {
"tables" : self.tables_snippet,
"fields" : _concat_fields(self.body_fields, ("=",","))
}
self.sql = template % body_snippet_fields
def __delete(self):
template = "DELETE FROM %(tables)s"
body_snippet_fields = {
"テーブル" : self.tables_snippet
}
self.sql = template % body_snippet_fields
def __build(self):
{
"SELECT": self.__select,
"INSERT":えーっと、
"UPDATE": self.__update,
"DELETE": self.__delete
}[self.current_token]()
def __unicode__(self):
return self.sql
def __str__(self):
return self.__unicode__()
def select(self, *args):
self.current_token = "SELECT"
self。 body_keys = args
self.__build()
return self
def insert(self, **kwargs):
self.current_token = "INSERT"
self.body_fields = self .__wrap_fields(kwargs)
self.__build()
return self
def update(self, **kwargs):
self.current_token = "UPDATE"
self.body_fields = self.__wrap_fields(kwargs)
self.__build()
return self
def delete(self, *conditions):
self.current_token = "DELETE"
self. __build()
#if *conditions:
self.where(*conditions)
return self
def where(self, *conditions):
条件 = list(map( str, 条件))
self.condition_snippet = " AND ".join(条件)
self.__where()
if hasattr(self, "where_snippet"):
self.sql += self .where_snippet
return self
次の举几个例子供大家参考吧:
复制代代码如下:
db = DataHelper(" /home/wangye/sample.db3")
db.open() # 打开数据库
db.execute("""
CREATE TABLE [staffs] (
[staff_id] INTEGER PRIMARY KEY AUTOINCREMENT ,
[staff_name] TEXT NOT NULL,
[staff_cardnum] TEXT NOT NULL,
[staff_reserved] INTEGER NOT NULL
)
""") # 直接実行SQL语句,注意这里commit_at_once默认は True
db.table("staffs").insert(staff_name="John", Staff_cardnum="1001", Staff_reserved=0)
# 插入一条记录
rs = db.table("staffs").select("staff_id", "staff_name").fetchall()
# 全てのstaff_idとstaff_name
rs = db.table("staffs") .select("staff_name").where(DataCondition(("=", "AND"), id = 1)).fetchone()
# 取一条staff_id=1のstaff_name
rs = db.table("staffs").select("staff_name").where(DataCondition(("<", "AND"), id = 100), DataCondition(("=", "AND"), Staff_reserved = 1)).fetchone()
# 取一条idは100以下でstaff_reservedは1のstaff_name记录
db.close() # 关闭数据库
現在、その星号(*) 操作規則をサポートしていません。また、多表同名列操作の面でも処理が得られません。これは日常の操作にのみ使用され、生成環境では最もよく使用されません。未知の問題がある可能性があるため。