sqlor/README.md
2025-10-23 15:17:24 +08:00

6.2 KiB
Executable File

SQLOR

SQLOR is a database api for python3, it is base on the python's DBAPI2

Features

  • Multiple database supported(Oracle, MySql, Postgresql, SQL Server
  • Both asynchronous API & synchronous API supported
  • Connection pools
  • Connection life cycle managements
  • Easy using API
  • Resources(connection object, cursor object) automatic recycled

requirements

  • python 3.9 or above
  • asyncio
  • Oracle DBAPI2 driver(cx_Oracle)
  • Postgresql DBAPI2 driver(aiopg)
  • Asynchronous MySQL driver(aiomysql)
  • Asynchronous Postgresql driver(aiopg)
  • clickhouse(clickhouse-connect)
  • Other driver can be easy integreated

Supported Database Types

  • oracle
  • mysql, mariadb
  • TiDB
  • clickHouse
  • DuckDB
  • PostgreSQL
  • MsSQL

Database Description json format

password in json data is encrypted by aes.

  • mysql, tidb, mariadb
{
	"databases":{
		"mydb":{
			"driver":"mysql",
			"kwargs":{
				"user":"test",
				"db":"cfae",
				"password":"test123",
				"host":"localhost"
			}
		}
	}
}
  • PostgreSQL
{
    "databases":{
        "mydb":{
            "driver":"postgresql",
            "kwargs":{
                "user":"test",
                "dbname":"cfae",
                "password":"test123",
                "host":"localhost"
            }
        }
    }
}
  • duckdb
{
    "databases":{
        "mydb":{
            "driver":"duckdb",
            "kwargs":{
                "dbfile":"ttt.ddb"
            }
        }
    }
}

Using

sqlor setup

First, Specified a server_path folder, under the server_path folder, need a named by "conf" subfolder. and a config.json file must be in the conf.

the config.json need "password_key" and "databases" attributes, like:

{
	.......
	"password_key":"tfyugihjo245g7g642yubv24g534",
	"databases":{
		.......
        "mydb":{
                "driver":"mysql",
                "kwargs":{
                        "user":"test",
                        "db":"database_name_in_your_database_engine",
                        "password":"encoded_password_string",
                        "host":"localhost"
                }
        }
	}
}

generates encoded password string

sqlor has a dbpassword script let you generate the "encoded_password_string" in config.json dbpassword usage:

dbpassword server_path database_password_of_user

script to use sqlor

import asyncio
from appPublic.worker import get_event_loop
from appPublic.jsonConfig import getConfig
from sqlor.dbpools  import DBPools, sqlorContext

loop = get_event_loop()
config = getConfig(server_path)
pool = DBPools(config.databases, loop=loop)

async def testfunc():
	dbname = 'mydb'
	db = DBPools()
	async with sqlorContext('stock') as sor:	
		# start a transaction
		# if exception happended, all change to database will rollback
		# else will commit
		sql = "select * from stock where stock_num = ${stock_num}"
		recs = await sor.sqlExe(sql, {'stock_num':'688888'})
		# return a list of DictObject instance
		sql1 = "select * from stock"
		recs = await sor.sqlPaging(sql, {'pagerows':50, 'page':1, 'sort':'stock_id'})
		# return a dictionary {
		#  'total': return all reocords count.
		#  'rows': list of DictObject instance
		# }
		ns = {'id':'666667'} # filters dictionary, find all records which id = '666667'
		recs = await sor.R('stock', ns)
		# recs is a list of data in DictObject instance
		ns = {'pagerows': 50, 'page':1, 'sort':stock_id'}
		# find all record in table 'stock', return page 1 data which 50 max records 
		dic = await sor.R('stock', ns)
		# return a dictionary {
		#  'total': return all reocords count.
		#  'rows': list of DictObject instance
		# }
		await sor.C('stock', {
			'stock_id': '111111',
			...
		})
		# add a record to 'stock' table
		await sor.D('stock', {'stock_id':'111111'})
		# delete a record in 'stock' table which stock_id = '111111'
		await sor.U('stock', {'stock_id':'111111', 'name':'new_name'})
		# update name field's value to 'new_name' which stock_id = '111111'


loop.run_until_complete(testfunc())

scripts

dbpassword

generate a encoded password for the password of the user of database

  • Syntax

dbpassword server_path password_text

1 server_path is folder where server_path/conf/config.json file have specifies password_key and databases

2 password_text is the password of the specified user of database

  • description

dbpassword encodes second argument password to a base64 based cyber, this cyber need to write into the password attribute under kwargs, and print the cyber to stdout

dbloader

load data in xlsx file to your database

  • Syntax dbloader server_path dbname xlsxfile

1 server_path is folder where server_path/conf/config.json file have specifies password_key and databases

2 dbname is database where the data will insert into

3 xlsxfile is a data file, can contains many sheets, sheet name is tablename, first rows of sheet contains the field name of the table, fields without data not need to appear in the sheet.

  • dbloader get data from each named sheet in xlsxfile, and insert them to database parellally,

API

Databases description data(dbdesc)

sqlor uses a dbdesc data(databases description data) which description how many databases and what database will using, and them connection parameters to create a dbpools objects

dbdesc data is a dict data, format of the dbdesc as follow:

{
        "mydb1":{			# name to identify a database connect
                "driver":"mysql",	# database dbapi2 driver package name 
                "async_mode":True,	# indicte this connection is asynchronous mode
                "coding":"utf8",	# charset coding
                "dbname":"cfae",	# database real name
                "kwargs":{		# connection parameters
                        "user":"test",
                        "db":"cfae",
                        "password":"encoded_password",
                        "host":"localhost"
                }
        },
        "mydb2":{
                "driver":"postgresql",
                "kwargs":{
                        "user":"test",
                        "dbname":"cfae",
                        "password":"test123",
                        "host":"localhost"
                }
        }
}

sqlor can using multiple databases and difference databases by using difference database driver

sql description data

class

DBPools

SQLor