ホームページ >バックエンド開発 >Python チュートリアル >Python SQLite3 データベース操作クラスの共有

Python SQLite3 データベース操作クラスの共有

WBOY
WBOYオリジナル
2016-06-16 08:43:471242ブラウズ

私は長い間 Python を使用していませんでしたが、最近データ分析が必要なプロジェクトを担当したため、言語機能に加えて、主に Python の優れたサポートを重視してプログラミング言語として Python を選択しました。 SQLite3 データベースは、大量の中間データを柔軟に処理する必要があるためです。

最初はまだいくつかのモジュールの SQL ステートメントを喜んで作成していましたが、徐々に飽きてきて、C# をいじっていたときに最初はリフレクションを使用して SQL クエリ コンストラクターを構築していたことを思い出しました。 linq を発見したので、もちろんこの計画は諦めました。その後、Microsoft が立ち上げられました。これらはすべて後回しで、今は Microsoft のことにはあまり興味がありません。本文を続けます。

ところで、もう 1 つ、優れたブログ プログラム Drupal も同様のクエリ ビルダーを使用してデータベース クエリを実行し、SQL ステートメントを直接記述することを避けるもう 1 つの利点は、プラットフォームの依存関係をある程度保護できることです。 、データベースの移行には依然として役立ちます。

しかし、今日紹介したデータベース補助クラスのクエリコンストラクターは非常に単純なものであり、子供向けのデータベースに限定されていますが、現時点では SQLite を操作するだけで十分です。大規模なアプリケーションの場合は、ORM を直接使用してください。


まずコードを見てください:

コードをコピー コードは次のとおりです:

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() # 关闭数据库

現在、その星号(*) 操作規則をサポートしていません。また、多表同名列操作の面でも処理が得られません。これは日常の操作にのみ使用され、生成環境では最もよく使用されません。未知の問題がある可能性があるため。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。