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

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

Jun 16, 2016 am 08:43 AM
python sqlite3

私は長い間 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Pythonパラメーター注釈は文字列を使用できますか? Pythonパラメーター注釈は文字列を使用できますか? Apr 01, 2025 pm 08:39 PM

Pythonパラメーター注釈の代替使用Pythonプログラミングでは、パラメーターアノテーションは、開発者が機能をよりよく理解して使用するのに役立つ非常に便利な機能です...

Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Apr 01, 2025 pm 11:30 PM

Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Pythonスクリプトを書くときは、以前の出力をカーソル位置にクリアするのが一般的です...

なぜ私のコードはAPIによってデータを返しているのですか?この問題を解決する方法は? なぜ私のコードはAPIによってデータを返しているのですか?この問題を解決する方法は? Apr 01, 2025 pm 08:09 PM

なぜ私のコードはAPIによってデータを返しているのですか?プログラミングでは、APIが呼び出すときにヌル値を返すという問題に遭遇することがよくあります。

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

GoまたはRustを使用してPythonスクリプトを呼び出して、真の並列実行を実現する方法は? GoまたはRustを使用してPythonスクリプトを呼び出して、真の並列実行を実現する方法は? Apr 01, 2025 pm 11:39 PM

GoまたはRustを使用してPythonスクリプトを呼び出して、真の並列実行を実現する方法は?最近、私はPythonを使用しています...

Windowsの下のpython .whlファイルをどこからダウンロードしますか? Windowsの下のpython .whlファイルをどこからダウンロードしますか? Apr 01, 2025 pm 08:18 PM

Pythonバイナリライブラリ(.whl)のダウンロードメソッドは、Windowsシステムに特定のライブラリをインストールする際に多くのPython開発者が遭遇する困難を調査します。一般的な解決策...

See all articles