lesscode-database 0.0.3__tar.gz → 0.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lesscode-database might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode_database
3
- Version: 0.0.3
3
+ Version: 0.0.4
4
4
  Summary: lesscode_database是数据库连接工具包
5
5
  Author: navysummer
6
6
  Author-email: navysummer@yeah.net
@@ -20,7 +20,7 @@ License-File: LICENSE
20
20
  ```python
21
21
  import asyncio
22
22
 
23
- from sqlalchemy import MetaData, Table, Column, VARCHAR, INTEGER, select
23
+ from sqlalchemy import select, Column, VARCHAR, INTEGER, Table, MetaData
24
24
  from sqlalchemy.ext.asyncio import async_sessionmaker
25
25
  from sqlalchemy.orm import sessionmaker
26
26
 
@@ -29,28 +29,42 @@ from lesscode_database.options import options
29
29
 
30
30
  options.conn_list = [
31
31
  ConnectionInfo(dialect="mysql", name="mysql", host="127.0.0.1", port=3306, user="root",
32
- password="root", db_name="test", enable=True, params={"pool_recycle": 3600},
32
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
33
33
  async_enable=True),
34
+ ConnectionInfo(dialect="doris", name="doris", host="127.0.0.1", port=9030, user="root",
35
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
36
+ async_enable=True),
37
+ ConnectionInfo(dialect="ocean_base", name="ocean_base", host="127.0.0.1", port=2883, user="root",
38
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
39
+ async_enable=True),
40
+ ConnectionInfo(dialect="tidb", name="tidb", host="127.0.0.1", port=4000, user="root",
41
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
42
+ async_enable=True),
43
+ ConnectionInfo(dialect="mssql", name="mssql", host="127.0.0.1", port=1433, user="root",
44
+ password="root", db_name="test", enable=False, async_enable=False),
45
+ ConnectionInfo(dialect="oracle", name="oracle", host="127.0.0.1", port=1521, user="root",
46
+ password="root", db_name="test", enable=False, async_enable=False),
47
+ ConnectionInfo(dialect="sqlite3", name="sqlite3", dsn="/test/test.db", async_enable=False),
34
48
  ConnectionInfo(dialect="elasticsearch", name="es", host="127.0.0.1", port=9210, user="root",
35
- password="root", enable=True, async_enable=True),
49
+ password="root", enable=False, async_enable=True),
36
50
  ConnectionInfo(dialect="mongo", name="mongo", host="127.0.0.1", port=27027, user="root",
37
- password="root", enable=True, async_enable=True),
51
+ password="root", enable=False, async_enable=True),
38
52
  ConnectionInfo(dialect="nebula", name="nebula", host="127.0.0.1", port=9669, user="root",
39
- password="nebula", db_name="nebula", enable=True),
53
+ password="nebula", db_name="nebula", enable=False),
40
54
  ConnectionInfo(dialect="postgresql", host="127.0.0.1", port=5454, user="root", password="root",
41
- db_name="root", enable=True, async_enable=True),
55
+ db_name="root", enable=False, async_enable=True),
42
56
  ConnectionInfo(dialect="redis", name="redis", host="127.0.0.1", port=6379, user=None,
43
- password=None, db_name=1, enable=True, async_enable=True),
57
+ password=None, db_name=1, enable=False, async_enable=True),
58
+ # sqlalchemy 异步支持mysql,postgresql,tidb,ocean_base,doris;
59
+ # 同步支持mysql,postgresql,tidb,ocean_base,doris,sqlite3,mssql,oracle
44
60
  ConnectionInfo(dialect="sqlalchemy", name="sqlalchemy", host="127.0.0.1", port=3306, user="root",
45
- password="root", db_name="test", enable=True, async_enable=True),
61
+ password="root", db_name="test", enable=False, async_enable=False, params={"db_type": "mysql"}),
46
62
  ConnectionInfo(dialect="neo4j", name="neo4j", host="127.0.0.1", port=7687, user="neo4j",
47
- password="neo4j", db_name=None, enable=True, async_enable=True),
63
+ password="neo4j", db_name=None, enable=False, async_enable=True),
48
64
  ConnectionInfo(dialect="clickhouse", name="clickhouse", dsn="clickhouse://localhost", host="127.0.0.1", port=9000,
49
65
  user="default", password="", db_name='', enable=True, async_enable=False),
50
66
 
51
67
  ]
52
- # 获取数据库连接池的方式
53
- ## options.name name是ConnectionInfo的name,options.conn_list里所有的name不可重复
54
68
 
55
69
  # mysql 同步测试,async_enable=False
56
70
  with options.mysql.dedicated_connection() as conn:
@@ -74,6 +88,90 @@ async def async_mysql_test():
74
88
  loop = asyncio.get_event_loop()
75
89
  loop.run_until_complete(async_mysql_test())
76
90
 
91
+ # doris 同步测试,async_enable=False
92
+ with options.doris.dedicated_connection() as conn:
93
+ conn.ping(reconnect=True)
94
+ with conn.cursor() as cursor:
95
+ cursor.execute("select 1")
96
+ description = cursor.description
97
+ rs = cursor.fetchone()
98
+ print(rs)
99
+
100
+
101
+ # doris 异步测试,async_enable=True
102
+ async def async_doris_test():
103
+ async with options.doris.acquire() as conn:
104
+ async with conn.cursor() as cursor:
105
+ await cursor.execute("select 1")
106
+ rs = await cursor.fetchone()
107
+ print(rs)
108
+
109
+
110
+ loop = asyncio.get_event_loop()
111
+ loop.run_until_complete(async_doris_test())
112
+
113
+ # ocean_base 同步测试,async_enable=False
114
+ with options.ocean_base.dedicated_connection() as conn:
115
+ conn.ping(reconnect=True)
116
+ with conn.cursor() as cursor:
117
+ cursor.execute("select 1")
118
+ description = cursor.description
119
+ rs = cursor.fetchone()
120
+ print(rs)
121
+
122
+
123
+ # ocean_base 异步测试,async_enable=True
124
+ async def async_ocean_base_test():
125
+ async with options.ocean_base.acquire() as conn:
126
+ async with conn.cursor() as cursor:
127
+ await cursor.execute("select 1")
128
+ rs = await cursor.fetchone()
129
+ print(rs)
130
+
131
+
132
+ loop = asyncio.get_event_loop()
133
+ loop.run_until_complete(async_ocean_base_test())
134
+
135
+ # tidb 同步测试,async_enable=False
136
+ with options.tidb.dedicated_connection() as conn:
137
+ conn.ping(reconnect=True)
138
+ with conn.cursor() as cursor:
139
+ cursor.execute("select 1")
140
+ description = cursor.description
141
+ rs = cursor.fetchone()
142
+ print(rs)
143
+
144
+
145
+ # tidb 异步测试,async_enable=True
146
+ async def async_tidb_test():
147
+ async with options.tidb.acquire() as conn:
148
+ async with conn.cursor() as cursor:
149
+ await cursor.execute("select 1")
150
+ rs = await cursor.fetchone()
151
+ print(rs)
152
+
153
+
154
+ loop = asyncio.get_event_loop()
155
+ loop.run_until_complete(async_tidb_test())
156
+
157
+
158
+ # sqlite3 异步测试
159
+ async def async_sqlite3_test():
160
+ cur = await options.sqlite3.cursor()
161
+ await cur.execute("SELECT 1")
162
+ row = await cur.fetchone()
163
+ print(row)
164
+
165
+
166
+ loop = asyncio.get_event_loop()
167
+ loop.run_until_complete(async_sqlite3_test())
168
+
169
+ # sqlite3 同步测试
170
+ cursor = options.sqlite3.cursor()
171
+ cursor.execute('select 1')
172
+ row = cursor.fetchone()
173
+ print(row)
174
+
77
175
  # es同步测试,async_enable=False
78
176
  body = {
79
177
  "query": {
@@ -103,6 +201,23 @@ async def async_es_test():
103
201
  loop = asyncio.get_event_loop()
104
202
  loop.run_until_complete(async_es_test())
105
203
 
204
+ # sql server同步测试
205
+ cursor = options.mssql.cursor()
206
+ cursor.execute('SELECT 1')
207
+ row = cursor.fetchone()
208
+ print(row)
209
+
210
+ # sql server暂不支持异步测试
211
+
212
+ # oracle 同步测试
213
+ cursor = options.oracle.cursor()
214
+ cursor.execute('select 1')
215
+ row = cursor.fetchone()
216
+ print(row)
217
+
218
+ # oracle暂不支持异步测试
219
+
220
+
106
221
  # mongo同步测试,async_enable=False
107
222
  print(options.mongo.test.test.find_one())
108
223
 
@@ -159,7 +274,7 @@ loop.run_until_complete(async_redis_test())
159
274
 
160
275
  # sqlalchemy table
161
276
  meta = MetaData()
162
- t1 = Table("test", meta, Column("name", VARCHAR(collation='utf8mb3_bin', length=255)),
277
+ t1 = Table("test_user", meta, Column("name", VARCHAR(collation='utf8mb3_bin', length=255)),
163
278
  Column(name='id', comment=None, nullable=False, autoincrement=False, primary_key=True, type_=INTEGER(),
164
279
  server_default=None))
165
280
 
@@ -183,25 +298,25 @@ loop.run_until_complete(async_sqlalchemy_test())
183
298
 
184
299
  # neo4j同步测试
185
300
  def query(tx):
186
- nql = "MATCH (t:Test) return t limit 1"
301
+ nql = "MATCH (c:Company) return c limit 1"
187
302
  for record in tx.run(nql):
188
303
  print(record)
189
304
 
190
305
 
191
- with options.neo4j.session(database="test") as session:
306
+ with options.neo4j.session(database="invest") as session:
192
307
  session.execute_read(query)
193
308
 
194
309
 
195
310
  # neo4j异步测试
196
311
  async def query(tx):
197
- nql = "MATCH (t:Test) return t limit 1"
312
+ nql = "MATCH (c:Company) return c limit 1"
198
313
  res = await tx.run(nql)
199
314
  async for record in res:
200
315
  print(record)
201
316
 
202
317
 
203
318
  async def async_neo4j_test():
204
- async with options.neo4j.session(database="test") as session:
319
+ async with options.neo4j.session(database="invest") as session:
205
320
  await session.execute_read(query)
206
321
 
207
322
 
@@ -227,4 +342,5 @@ async def async_clickhouse_test():
227
342
  loop = asyncio.get_event_loop()
228
343
  loop.run_until_complete(async_clickhouse_test())
229
344
 
345
+
230
346
  ```
@@ -7,7 +7,7 @@
7
7
  ```python
8
8
  import asyncio
9
9
 
10
- from sqlalchemy import MetaData, Table, Column, VARCHAR, INTEGER, select
10
+ from sqlalchemy import select, Column, VARCHAR, INTEGER, Table, MetaData
11
11
  from sqlalchemy.ext.asyncio import async_sessionmaker
12
12
  from sqlalchemy.orm import sessionmaker
13
13
 
@@ -16,28 +16,42 @@ from lesscode_database.options import options
16
16
 
17
17
  options.conn_list = [
18
18
  ConnectionInfo(dialect="mysql", name="mysql", host="127.0.0.1", port=3306, user="root",
19
- password="root", db_name="test", enable=True, params={"pool_recycle": 3600},
19
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
20
20
  async_enable=True),
21
+ ConnectionInfo(dialect="doris", name="doris", host="127.0.0.1", port=9030, user="root",
22
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
23
+ async_enable=True),
24
+ ConnectionInfo(dialect="ocean_base", name="ocean_base", host="127.0.0.1", port=2883, user="root",
25
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
26
+ async_enable=True),
27
+ ConnectionInfo(dialect="tidb", name="tidb", host="127.0.0.1", port=4000, user="root",
28
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
29
+ async_enable=True),
30
+ ConnectionInfo(dialect="mssql", name="mssql", host="127.0.0.1", port=1433, user="root",
31
+ password="root", db_name="test", enable=False, async_enable=False),
32
+ ConnectionInfo(dialect="oracle", name="oracle", host="127.0.0.1", port=1521, user="root",
33
+ password="root", db_name="test", enable=False, async_enable=False),
34
+ ConnectionInfo(dialect="sqlite3", name="sqlite3", dsn="/test/test.db", async_enable=False),
21
35
  ConnectionInfo(dialect="elasticsearch", name="es", host="127.0.0.1", port=9210, user="root",
22
- password="root", enable=True, async_enable=True),
36
+ password="root", enable=False, async_enable=True),
23
37
  ConnectionInfo(dialect="mongo", name="mongo", host="127.0.0.1", port=27027, user="root",
24
- password="root", enable=True, async_enable=True),
38
+ password="root", enable=False, async_enable=True),
25
39
  ConnectionInfo(dialect="nebula", name="nebula", host="127.0.0.1", port=9669, user="root",
26
- password="nebula", db_name="nebula", enable=True),
40
+ password="nebula", db_name="nebula", enable=False),
27
41
  ConnectionInfo(dialect="postgresql", host="127.0.0.1", port=5454, user="root", password="root",
28
- db_name="root", enable=True, async_enable=True),
42
+ db_name="root", enable=False, async_enable=True),
29
43
  ConnectionInfo(dialect="redis", name="redis", host="127.0.0.1", port=6379, user=None,
30
- password=None, db_name=1, enable=True, async_enable=True),
44
+ password=None, db_name=1, enable=False, async_enable=True),
45
+ # sqlalchemy 异步支持mysql,postgresql,tidb,ocean_base,doris;
46
+ # 同步支持mysql,postgresql,tidb,ocean_base,doris,sqlite3,mssql,oracle
31
47
  ConnectionInfo(dialect="sqlalchemy", name="sqlalchemy", host="127.0.0.1", port=3306, user="root",
32
- password="root", db_name="test", enable=True, async_enable=True),
48
+ password="root", db_name="test", enable=False, async_enable=False, params={"db_type": "mysql"}),
33
49
  ConnectionInfo(dialect="neo4j", name="neo4j", host="127.0.0.1", port=7687, user="neo4j",
34
- password="neo4j", db_name=None, enable=True, async_enable=True),
50
+ password="neo4j", db_name=None, enable=False, async_enable=True),
35
51
  ConnectionInfo(dialect="clickhouse", name="clickhouse", dsn="clickhouse://localhost", host="127.0.0.1", port=9000,
36
52
  user="default", password="", db_name='', enable=True, async_enable=False),
37
53
 
38
54
  ]
39
- # 获取数据库连接池的方式
40
- ## options.name name是ConnectionInfo的name,options.conn_list里所有的name不可重复
41
55
 
42
56
  # mysql 同步测试,async_enable=False
43
57
  with options.mysql.dedicated_connection() as conn:
@@ -61,6 +75,90 @@ async def async_mysql_test():
61
75
  loop = asyncio.get_event_loop()
62
76
  loop.run_until_complete(async_mysql_test())
63
77
 
78
+ # doris 同步测试,async_enable=False
79
+ with options.doris.dedicated_connection() as conn:
80
+ conn.ping(reconnect=True)
81
+ with conn.cursor() as cursor:
82
+ cursor.execute("select 1")
83
+ description = cursor.description
84
+ rs = cursor.fetchone()
85
+ print(rs)
86
+
87
+
88
+ # doris 异步测试,async_enable=True
89
+ async def async_doris_test():
90
+ async with options.doris.acquire() as conn:
91
+ async with conn.cursor() as cursor:
92
+ await cursor.execute("select 1")
93
+ rs = await cursor.fetchone()
94
+ print(rs)
95
+
96
+
97
+ loop = asyncio.get_event_loop()
98
+ loop.run_until_complete(async_doris_test())
99
+
100
+ # ocean_base 同步测试,async_enable=False
101
+ with options.ocean_base.dedicated_connection() as conn:
102
+ conn.ping(reconnect=True)
103
+ with conn.cursor() as cursor:
104
+ cursor.execute("select 1")
105
+ description = cursor.description
106
+ rs = cursor.fetchone()
107
+ print(rs)
108
+
109
+
110
+ # ocean_base 异步测试,async_enable=True
111
+ async def async_ocean_base_test():
112
+ async with options.ocean_base.acquire() as conn:
113
+ async with conn.cursor() as cursor:
114
+ await cursor.execute("select 1")
115
+ rs = await cursor.fetchone()
116
+ print(rs)
117
+
118
+
119
+ loop = asyncio.get_event_loop()
120
+ loop.run_until_complete(async_ocean_base_test())
121
+
122
+ # tidb 同步测试,async_enable=False
123
+ with options.tidb.dedicated_connection() as conn:
124
+ conn.ping(reconnect=True)
125
+ with conn.cursor() as cursor:
126
+ cursor.execute("select 1")
127
+ description = cursor.description
128
+ rs = cursor.fetchone()
129
+ print(rs)
130
+
131
+
132
+ # tidb 异步测试,async_enable=True
133
+ async def async_tidb_test():
134
+ async with options.tidb.acquire() as conn:
135
+ async with conn.cursor() as cursor:
136
+ await cursor.execute("select 1")
137
+ rs = await cursor.fetchone()
138
+ print(rs)
139
+
140
+
141
+ loop = asyncio.get_event_loop()
142
+ loop.run_until_complete(async_tidb_test())
143
+
144
+
145
+ # sqlite3 异步测试
146
+ async def async_sqlite3_test():
147
+ cur = await options.sqlite3.cursor()
148
+ await cur.execute("SELECT 1")
149
+ row = await cur.fetchone()
150
+ print(row)
151
+
152
+
153
+ loop = asyncio.get_event_loop()
154
+ loop.run_until_complete(async_sqlite3_test())
155
+
156
+ # sqlite3 同步测试
157
+ cursor = options.sqlite3.cursor()
158
+ cursor.execute('select 1')
159
+ row = cursor.fetchone()
160
+ print(row)
161
+
64
162
  # es同步测试,async_enable=False
65
163
  body = {
66
164
  "query": {
@@ -90,6 +188,23 @@ async def async_es_test():
90
188
  loop = asyncio.get_event_loop()
91
189
  loop.run_until_complete(async_es_test())
92
190
 
191
+ # sql server同步测试
192
+ cursor = options.mssql.cursor()
193
+ cursor.execute('SELECT 1')
194
+ row = cursor.fetchone()
195
+ print(row)
196
+
197
+ # sql server暂不支持异步测试
198
+
199
+ # oracle 同步测试
200
+ cursor = options.oracle.cursor()
201
+ cursor.execute('select 1')
202
+ row = cursor.fetchone()
203
+ print(row)
204
+
205
+ # oracle暂不支持异步测试
206
+
207
+
93
208
  # mongo同步测试,async_enable=False
94
209
  print(options.mongo.test.test.find_one())
95
210
 
@@ -146,7 +261,7 @@ loop.run_until_complete(async_redis_test())
146
261
 
147
262
  # sqlalchemy table
148
263
  meta = MetaData()
149
- t1 = Table("test", meta, Column("name", VARCHAR(collation='utf8mb3_bin', length=255)),
264
+ t1 = Table("test_user", meta, Column("name", VARCHAR(collation='utf8mb3_bin', length=255)),
150
265
  Column(name='id', comment=None, nullable=False, autoincrement=False, primary_key=True, type_=INTEGER(),
151
266
  server_default=None))
152
267
 
@@ -170,25 +285,25 @@ loop.run_until_complete(async_sqlalchemy_test())
170
285
 
171
286
  # neo4j同步测试
172
287
  def query(tx):
173
- nql = "MATCH (t:Test) return t limit 1"
288
+ nql = "MATCH (c:Company) return c limit 1"
174
289
  for record in tx.run(nql):
175
290
  print(record)
176
291
 
177
292
 
178
- with options.neo4j.session(database="test") as session:
293
+ with options.neo4j.session(database="invest") as session:
179
294
  session.execute_read(query)
180
295
 
181
296
 
182
297
  # neo4j异步测试
183
298
  async def query(tx):
184
- nql = "MATCH (t:Test) return t limit 1"
299
+ nql = "MATCH (c:Company) return c limit 1"
185
300
  res = await tx.run(nql)
186
301
  async for record in res:
187
302
  print(record)
188
303
 
189
304
 
190
305
  async def async_neo4j_test():
191
- async with options.neo4j.session(database="test") as session:
306
+ async with options.neo4j.session(database="invest") as session:
192
307
  await session.execute_read(query)
193
308
 
194
309
 
@@ -214,4 +329,5 @@ async def async_clickhouse_test():
214
329
  loop = asyncio.get_event_loop()
215
330
  loop.run_until_complete(async_clickhouse_test())
216
331
 
332
+
217
333
  ```
@@ -124,7 +124,7 @@ class Pool:
124
124
  try:
125
125
  aiomysql = importlib.import_module("aiomysql")
126
126
  except ImportError:
127
- raise Exception(f"pymysql is not exist,run:pip install aiomysql")
127
+ raise Exception(f"aiomysql is not exist,run:pip install aiomysql")
128
128
  pool = await aiomysql.create_pool(host=conn_info.host, port=conn_info.port,
129
129
  user=conn_info.user,
130
130
  password=conn_info.password,
@@ -159,6 +159,227 @@ class Pool:
159
159
  read_timeout=30)
160
160
  return pool
161
161
 
162
+ @staticmethod
163
+ async def create_sqlite3_pool(conn_info: ConnectionInfo):
164
+ """
165
+ 创建mysql 异步连接池
166
+ :param conn_info: 连接信息
167
+ :return:
168
+ """
169
+ try:
170
+ aiosqlite3 = importlib.import_module("aiosqlite3")
171
+ except ImportError:
172
+ raise Exception(f"aiosqlite3 is not exist,run:pip install aiosqlite3")
173
+ pool = await aiosqlite3.connect(database=conn_info.dsn)
174
+ return pool
175
+
176
+ @staticmethod
177
+ def sync_create_sqlite3_pool(conn_info: ConnectionInfo):
178
+ """
179
+ 创建mysql 同步连接池
180
+ :param conn_info: 连接信息
181
+ :return:
182
+ """
183
+ try:
184
+ sqlite3 = importlib.import_module("sqlite3")
185
+ except ImportError:
186
+ raise Exception(f"sqlite3 is not exist,run:pip install sqlite3")
187
+ try:
188
+ pooled_db = importlib.import_module("dbutils.pooled_db")
189
+ except ImportError:
190
+ raise Exception(f"DBUtils is not exist,run:pip install DBUtils")
191
+ pool = pooled_db.PooledDB(creator=sqlite3, host=conn_info.host, port=conn_info.port,
192
+ user=conn_info.user,
193
+ passwd=conn_info.password, db=conn_info.db_name,
194
+ mincached=conn_info.min_size, blocking=True, maxusage=conn_info.min_size,
195
+ maxshared=conn_info.max_size, maxcached=conn_info.max_size,
196
+ ping=1, maxconnections=conn_info.max_size, charset="utf8mb4", autocommit=True,
197
+ read_timeout=30)
198
+ return pool
199
+
200
+ @staticmethod
201
+ def sync_create_mssql_pool(conn_info: ConnectionInfo):
202
+ """
203
+ 创建mysql 同步连接池
204
+ :param conn_info: 连接信息
205
+ :return:
206
+ """
207
+ try:
208
+ pymssql = importlib.import_module("pymssql")
209
+ except ImportError:
210
+ raise Exception(f"pymssql is not exist,run:pip install pymssql")
211
+ try:
212
+ pooled_db = importlib.import_module("dbutils.pooled_db")
213
+ except ImportError:
214
+ raise Exception(f"DBUtils is not exist,run:pip install DBUtils")
215
+ pool = pooled_db.PooledDB(creator=pymssql, host=conn_info.host, port=conn_info.port,
216
+ user=conn_info.user,
217
+ passwd=conn_info.password, db=conn_info.db_name,
218
+ mincached=conn_info.min_size, blocking=True, maxusage=conn_info.min_size,
219
+ maxshared=conn_info.max_size, maxcached=conn_info.max_size,
220
+ ping=1, maxconnections=conn_info.max_size, charset="utf8mb4", autocommit=True,
221
+ read_timeout=30)
222
+ return pool
223
+
224
+ @staticmethod
225
+ def sync_create_oracle_pool(conn_info: ConnectionInfo):
226
+ """
227
+ 创建mysql 同步连接池
228
+ :param conn_info: 连接信息
229
+ :return:
230
+ """
231
+ try:
232
+ cx_oracle = importlib.import_module("cx_Oracle")
233
+ except ImportError:
234
+ raise Exception(f"cx_Oracle is not exist,run:pip install cx_Oracle")
235
+ try:
236
+ pooled_db = importlib.import_module("dbutils.pooled_db")
237
+ except ImportError:
238
+ raise Exception(f"DBUtils is not exist,run:pip install DBUtils")
239
+ pool = pooled_db.PooledDB(creator=cx_oracle, host=conn_info.host, port=conn_info.port,
240
+ user=conn_info.user,
241
+ passwd=conn_info.password, db=conn_info.db_name,
242
+ mincached=conn_info.min_size, blocking=True, maxusage=conn_info.min_size,
243
+ maxshared=conn_info.max_size, maxcached=conn_info.max_size,
244
+ ping=1, maxconnections=conn_info.max_size, charset="utf8mb4", autocommit=True,
245
+ read_timeout=30)
246
+ return pool
247
+
248
+ @staticmethod
249
+ async def create_doris_pool(conn_info: ConnectionInfo):
250
+ """
251
+ 创建doris 异步连接池
252
+ :param conn_info: 连接信息
253
+ :return:
254
+ """
255
+ try:
256
+ aiomysql = importlib.import_module("aiomysql")
257
+ except ImportError:
258
+ raise Exception(f"aiomysql is not exist,run:pip install aiomysql")
259
+ pool = await aiomysql.create_pool(host=conn_info.host, port=conn_info.port,
260
+ user=conn_info.user,
261
+ password=conn_info.password,
262
+ pool_recycle=conn_info.params.get("pool_recycle", 3600)
263
+ if conn_info.params else 3600,
264
+ db=conn_info.db_name, autocommit=True,
265
+ minsize=conn_info.min_size,
266
+ maxsize=conn_info.max_size)
267
+ return pool
268
+
269
+ @staticmethod
270
+ def sync_create_doris_pool(conn_info: ConnectionInfo):
271
+ """
272
+ 创建doris 同步连接池
273
+ :param conn_info: 连接信息
274
+ :return:
275
+ """
276
+ try:
277
+ pymysql = importlib.import_module("pymysql")
278
+ except ImportError:
279
+ raise Exception(f"pymysql is not exist,run:pip install pymysql")
280
+ try:
281
+ pooled_db = importlib.import_module("dbutils.pooled_db")
282
+ except ImportError:
283
+ raise Exception(f"DBUtils is not exist,run:pip install DBUtils")
284
+ pool = pooled_db.PooledDB(creator=pymysql, host=conn_info.host, port=conn_info.port,
285
+ user=conn_info.user,
286
+ passwd=conn_info.password, db=conn_info.db_name,
287
+ mincached=conn_info.min_size, blocking=True, maxusage=conn_info.min_size,
288
+ maxshared=conn_info.max_size, maxcached=conn_info.max_size,
289
+ ping=1, maxconnections=conn_info.max_size, charset="utf8mb4", autocommit=True,
290
+ read_timeout=30)
291
+ return pool
292
+
293
+ @staticmethod
294
+ async def create_tidb_pool(conn_info: ConnectionInfo):
295
+ """
296
+ 创建tidb 异步连接池
297
+ :param conn_info: 连接信息
298
+ :return:
299
+ """
300
+ try:
301
+ aiomysql = importlib.import_module("aiomysql")
302
+ except ImportError:
303
+ raise Exception(f"aiomysql is not exist,run:pip install aiomysql")
304
+ pool = await aiomysql.create_pool(host=conn_info.host, port=conn_info.port,
305
+ user=conn_info.user,
306
+ password=conn_info.password,
307
+ pool_recycle=conn_info.params.get("pool_recycle", 3600)
308
+ if conn_info.params else 3600,
309
+ db=conn_info.db_name, autocommit=True,
310
+ minsize=conn_info.min_size,
311
+ maxsize=conn_info.max_size)
312
+ return pool
313
+
314
+ @staticmethod
315
+ def sync_create_tidb_pool(conn_info: ConnectionInfo):
316
+ """
317
+ 创建tidb 同步连接池
318
+ :param conn_info: 连接信息
319
+ :return:
320
+ """
321
+ try:
322
+ pymysql = importlib.import_module("pymysql")
323
+ except ImportError:
324
+ raise Exception(f"pymysql is not exist,run:pip install pymysql")
325
+ try:
326
+ pooled_db = importlib.import_module("dbutils.pooled_db")
327
+ except ImportError:
328
+ raise Exception(f"DBUtils is not exist,run:pip install DBUtils")
329
+ pool = pooled_db.PooledDB(creator=pymysql, host=conn_info.host, port=conn_info.port,
330
+ user=conn_info.user,
331
+ passwd=conn_info.password, db=conn_info.db_name,
332
+ mincached=conn_info.min_size, blocking=True, maxusage=conn_info.min_size,
333
+ maxshared=conn_info.max_size, maxcached=conn_info.max_size,
334
+ ping=1, maxconnections=conn_info.max_size, charset="utf8mb4", autocommit=True,
335
+ read_timeout=30)
336
+ return pool
337
+
338
+ @staticmethod
339
+ async def create_ocean_base_pool(conn_info: ConnectionInfo):
340
+ """
341
+ 创建ocean_base 异步连接池
342
+ :param conn_info: 连接信息
343
+ :return:
344
+ """
345
+ try:
346
+ aiomysql = importlib.import_module("aiomysql")
347
+ except ImportError:
348
+ raise Exception(f"aiomysql is not exist,run:pip install aiomysql")
349
+ pool = await aiomysql.create_pool(host=conn_info.host, port=conn_info.port,
350
+ user=conn_info.user,
351
+ password=conn_info.password,
352
+ pool_recycle=conn_info.params.get("pool_recycle", 3600)
353
+ if conn_info.params else 3600,
354
+ db=conn_info.db_name, autocommit=True,
355
+ minsize=conn_info.min_size,
356
+ maxsize=conn_info.max_size)
357
+ return pool
358
+
359
+ @staticmethod
360
+ def sync_create_ocean_base_pool(conn_info: ConnectionInfo):
361
+ """
362
+ 创建ocean_base 同步连接池
363
+ :param conn_info: 连接信息
364
+ :return:
365
+ """
366
+ try:
367
+ pymysql = importlib.import_module("pymysql")
368
+ except ImportError:
369
+ raise Exception(f"pymysql is not exist,run:pip install pymysql")
370
+ try:
371
+ pooled_db = importlib.import_module("dbutils.pooled_db")
372
+ except ImportError:
373
+ raise Exception(f"DBUtils is not exist,run:pip install DBUtils")
374
+ pool = pooled_db.PooledDB(creator=pymysql, host=conn_info.host, port=conn_info.port,
375
+ user=conn_info.user,
376
+ passwd=conn_info.password, db=conn_info.db_name,
377
+ mincached=conn_info.min_size, blocking=True, maxusage=conn_info.min_size,
378
+ maxshared=conn_info.max_size, maxcached=conn_info.max_size,
379
+ ping=1, maxconnections=conn_info.max_size, charset="utf8mb4", autocommit=True,
380
+ read_timeout=30)
381
+ return pool
382
+
162
383
  @staticmethod
163
384
  def sync_create_nebula_pool(conn_info: ConnectionInfo):
164
385
  """
@@ -427,6 +648,10 @@ class Pool:
427
648
  url = 'mysql+aiomysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(
428
649
  conn_info.user, conn_info.password, conn_info.host, conn_info.port,
429
650
  conn_info.db_name)
651
+ elif db_type == "doris":
652
+ url = 'mysql+aiomysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(
653
+ conn_info.user, conn_info.password, conn_info.host, conn_info.port,
654
+ conn_info.db_name)
430
655
  else:
431
656
  raise Exception("UNSUPPORTED DB TYPE")
432
657
  try:
@@ -476,6 +701,20 @@ class Pool:
476
701
  url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(
477
702
  conn_info.user, conn_info.password, conn_info.host, conn_info.port,
478
703
  conn_info.db_name)
704
+ elif db_type == "doris":
705
+ url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(
706
+ conn_info.user, conn_info.password, conn_info.host, conn_info.port,
707
+ conn_info.db_name)
708
+ elif db_type == "sqlite3":
709
+ url = conn_info.dsn
710
+ elif db_type == "mssql":
711
+ url = "mssql+pymssql://{}:{}@{}:{}/{}?charset=utf8mb4".format(
712
+ conn_info.user, conn_info.password, conn_info.host, conn_info.port,
713
+ conn_info.db_name)
714
+ elif db_type == "oracle":
715
+ url = "oracle+cx_oracle://{}:{}@{}:{}/{}?charset=utf8mb4".format(
716
+ conn_info.user, conn_info.password, conn_info.host, conn_info.port,
717
+ conn_info.db_name)
479
718
  else:
480
719
  raise Exception("UNSUPPORTED DB TYPE")
481
720
  try:
@@ -525,6 +764,30 @@ def get_pool(conn_info: ConnectionInfo):
525
764
  else:
526
765
  return run_sync(Pool.sync_create_mysql_pool(conn_info))
527
766
 
767
+ elif conn_info.dialect == "doris":
768
+ if conn_info.async_enable:
769
+ return run_sync(Pool.create_doris_pool(conn_info))
770
+ else:
771
+ return run_sync(Pool.sync_create_doris_pool(conn_info))
772
+
773
+ elif conn_info.dialect == "ocean_base":
774
+ if conn_info.async_enable:
775
+ return run_sync(Pool.create_ocean_base_pool(conn_info))
776
+ else:
777
+ return run_sync(Pool.sync_create_ocean_base_pool(conn_info))
778
+
779
+ elif conn_info.dialect == "tidb":
780
+ if conn_info.async_enable:
781
+ return run_sync(Pool.create_tidb_pool(conn_info))
782
+ else:
783
+ return run_sync(Pool.sync_create_tidb_pool(conn_info))
784
+
785
+ elif conn_info.dialect == "mssql":
786
+ return run_sync(Pool.sync_create_mssql_pool(conn_info))
787
+
788
+ elif conn_info.dialect == "oracle":
789
+ return run_sync(Pool.sync_create_oracle_pool(conn_info))
790
+
528
791
  elif conn_info.dialect == "nebula":
529
792
  return run_sync(Pool.sync_create_nebula_pool(conn_info))
530
793
 
@@ -540,6 +803,12 @@ def get_pool(conn_info: ConnectionInfo):
540
803
  else:
541
804
  return run_sync(Pool.sync_create_postgresql_pool(conn_info))
542
805
 
806
+ elif conn_info.dialect == "sqlite3":
807
+ if conn_info.async_enable:
808
+ return run_sync(Pool.create_sqlite3_pool(conn_info))
809
+ else:
810
+ return run_sync(Pool.sync_create_sqlite3_pool(conn_info))
811
+
543
812
  elif conn_info.dialect == "redis":
544
813
  if conn_info.async_enable:
545
814
  return run_sync(Pool.create_redis_pool(conn_info))
@@ -0,0 +1 @@
1
+ __version__ = "0.0.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-database
3
- Version: 0.0.3
3
+ Version: 0.0.4
4
4
  Summary: lesscode_database是数据库连接工具包
5
5
  Author: navysummer
6
6
  Author-email: navysummer@yeah.net
@@ -20,7 +20,7 @@ License-File: LICENSE
20
20
  ```python
21
21
  import asyncio
22
22
 
23
- from sqlalchemy import MetaData, Table, Column, VARCHAR, INTEGER, select
23
+ from sqlalchemy import select, Column, VARCHAR, INTEGER, Table, MetaData
24
24
  from sqlalchemy.ext.asyncio import async_sessionmaker
25
25
  from sqlalchemy.orm import sessionmaker
26
26
 
@@ -29,28 +29,42 @@ from lesscode_database.options import options
29
29
 
30
30
  options.conn_list = [
31
31
  ConnectionInfo(dialect="mysql", name="mysql", host="127.0.0.1", port=3306, user="root",
32
- password="root", db_name="test", enable=True, params={"pool_recycle": 3600},
32
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
33
33
  async_enable=True),
34
+ ConnectionInfo(dialect="doris", name="doris", host="127.0.0.1", port=9030, user="root",
35
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
36
+ async_enable=True),
37
+ ConnectionInfo(dialect="ocean_base", name="ocean_base", host="127.0.0.1", port=2883, user="root",
38
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
39
+ async_enable=True),
40
+ ConnectionInfo(dialect="tidb", name="tidb", host="127.0.0.1", port=4000, user="root",
41
+ password="root", db_name="test", enable=False, params={"pool_recycle": 3600},
42
+ async_enable=True),
43
+ ConnectionInfo(dialect="mssql", name="mssql", host="127.0.0.1", port=1433, user="root",
44
+ password="root", db_name="test", enable=False, async_enable=False),
45
+ ConnectionInfo(dialect="oracle", name="oracle", host="127.0.0.1", port=1521, user="root",
46
+ password="root", db_name="test", enable=False, async_enable=False),
47
+ ConnectionInfo(dialect="sqlite3", name="sqlite3", dsn="/test/test.db", async_enable=False),
34
48
  ConnectionInfo(dialect="elasticsearch", name="es", host="127.0.0.1", port=9210, user="root",
35
- password="root", enable=True, async_enable=True),
49
+ password="root", enable=False, async_enable=True),
36
50
  ConnectionInfo(dialect="mongo", name="mongo", host="127.0.0.1", port=27027, user="root",
37
- password="root", enable=True, async_enable=True),
51
+ password="root", enable=False, async_enable=True),
38
52
  ConnectionInfo(dialect="nebula", name="nebula", host="127.0.0.1", port=9669, user="root",
39
- password="nebula", db_name="nebula", enable=True),
53
+ password="nebula", db_name="nebula", enable=False),
40
54
  ConnectionInfo(dialect="postgresql", host="127.0.0.1", port=5454, user="root", password="root",
41
- db_name="root", enable=True, async_enable=True),
55
+ db_name="root", enable=False, async_enable=True),
42
56
  ConnectionInfo(dialect="redis", name="redis", host="127.0.0.1", port=6379, user=None,
43
- password=None, db_name=1, enable=True, async_enable=True),
57
+ password=None, db_name=1, enable=False, async_enable=True),
58
+ # sqlalchemy 异步支持mysql,postgresql,tidb,ocean_base,doris;
59
+ # 同步支持mysql,postgresql,tidb,ocean_base,doris,sqlite3,mssql,oracle
44
60
  ConnectionInfo(dialect="sqlalchemy", name="sqlalchemy", host="127.0.0.1", port=3306, user="root",
45
- password="root", db_name="test", enable=True, async_enable=True),
61
+ password="root", db_name="test", enable=False, async_enable=False, params={"db_type": "mysql"}),
46
62
  ConnectionInfo(dialect="neo4j", name="neo4j", host="127.0.0.1", port=7687, user="neo4j",
47
- password="neo4j", db_name=None, enable=True, async_enable=True),
63
+ password="neo4j", db_name=None, enable=False, async_enable=True),
48
64
  ConnectionInfo(dialect="clickhouse", name="clickhouse", dsn="clickhouse://localhost", host="127.0.0.1", port=9000,
49
65
  user="default", password="", db_name='', enable=True, async_enable=False),
50
66
 
51
67
  ]
52
- # 获取数据库连接池的方式
53
- ## options.name name是ConnectionInfo的name,options.conn_list里所有的name不可重复
54
68
 
55
69
  # mysql 同步测试,async_enable=False
56
70
  with options.mysql.dedicated_connection() as conn:
@@ -74,6 +88,90 @@ async def async_mysql_test():
74
88
  loop = asyncio.get_event_loop()
75
89
  loop.run_until_complete(async_mysql_test())
76
90
 
91
+ # doris 同步测试,async_enable=False
92
+ with options.doris.dedicated_connection() as conn:
93
+ conn.ping(reconnect=True)
94
+ with conn.cursor() as cursor:
95
+ cursor.execute("select 1")
96
+ description = cursor.description
97
+ rs = cursor.fetchone()
98
+ print(rs)
99
+
100
+
101
+ # doris 异步测试,async_enable=True
102
+ async def async_doris_test():
103
+ async with options.doris.acquire() as conn:
104
+ async with conn.cursor() as cursor:
105
+ await cursor.execute("select 1")
106
+ rs = await cursor.fetchone()
107
+ print(rs)
108
+
109
+
110
+ loop = asyncio.get_event_loop()
111
+ loop.run_until_complete(async_doris_test())
112
+
113
+ # ocean_base 同步测试,async_enable=False
114
+ with options.ocean_base.dedicated_connection() as conn:
115
+ conn.ping(reconnect=True)
116
+ with conn.cursor() as cursor:
117
+ cursor.execute("select 1")
118
+ description = cursor.description
119
+ rs = cursor.fetchone()
120
+ print(rs)
121
+
122
+
123
+ # ocean_base 异步测试,async_enable=True
124
+ async def async_ocean_base_test():
125
+ async with options.ocean_base.acquire() as conn:
126
+ async with conn.cursor() as cursor:
127
+ await cursor.execute("select 1")
128
+ rs = await cursor.fetchone()
129
+ print(rs)
130
+
131
+
132
+ loop = asyncio.get_event_loop()
133
+ loop.run_until_complete(async_ocean_base_test())
134
+
135
+ # tidb 同步测试,async_enable=False
136
+ with options.tidb.dedicated_connection() as conn:
137
+ conn.ping(reconnect=True)
138
+ with conn.cursor() as cursor:
139
+ cursor.execute("select 1")
140
+ description = cursor.description
141
+ rs = cursor.fetchone()
142
+ print(rs)
143
+
144
+
145
+ # tidb 异步测试,async_enable=True
146
+ async def async_tidb_test():
147
+ async with options.tidb.acquire() as conn:
148
+ async with conn.cursor() as cursor:
149
+ await cursor.execute("select 1")
150
+ rs = await cursor.fetchone()
151
+ print(rs)
152
+
153
+
154
+ loop = asyncio.get_event_loop()
155
+ loop.run_until_complete(async_tidb_test())
156
+
157
+
158
+ # sqlite3 异步测试
159
+ async def async_sqlite3_test():
160
+ cur = await options.sqlite3.cursor()
161
+ await cur.execute("SELECT 1")
162
+ row = await cur.fetchone()
163
+ print(row)
164
+
165
+
166
+ loop = asyncio.get_event_loop()
167
+ loop.run_until_complete(async_sqlite3_test())
168
+
169
+ # sqlite3 同步测试
170
+ cursor = options.sqlite3.cursor()
171
+ cursor.execute('select 1')
172
+ row = cursor.fetchone()
173
+ print(row)
174
+
77
175
  # es同步测试,async_enable=False
78
176
  body = {
79
177
  "query": {
@@ -103,6 +201,23 @@ async def async_es_test():
103
201
  loop = asyncio.get_event_loop()
104
202
  loop.run_until_complete(async_es_test())
105
203
 
204
+ # sql server同步测试
205
+ cursor = options.mssql.cursor()
206
+ cursor.execute('SELECT 1')
207
+ row = cursor.fetchone()
208
+ print(row)
209
+
210
+ # sql server暂不支持异步测试
211
+
212
+ # oracle 同步测试
213
+ cursor = options.oracle.cursor()
214
+ cursor.execute('select 1')
215
+ row = cursor.fetchone()
216
+ print(row)
217
+
218
+ # oracle暂不支持异步测试
219
+
220
+
106
221
  # mongo同步测试,async_enable=False
107
222
  print(options.mongo.test.test.find_one())
108
223
 
@@ -159,7 +274,7 @@ loop.run_until_complete(async_redis_test())
159
274
 
160
275
  # sqlalchemy table
161
276
  meta = MetaData()
162
- t1 = Table("test", meta, Column("name", VARCHAR(collation='utf8mb3_bin', length=255)),
277
+ t1 = Table("test_user", meta, Column("name", VARCHAR(collation='utf8mb3_bin', length=255)),
163
278
  Column(name='id', comment=None, nullable=False, autoincrement=False, primary_key=True, type_=INTEGER(),
164
279
  server_default=None))
165
280
 
@@ -183,25 +298,25 @@ loop.run_until_complete(async_sqlalchemy_test())
183
298
 
184
299
  # neo4j同步测试
185
300
  def query(tx):
186
- nql = "MATCH (t:Test) return t limit 1"
301
+ nql = "MATCH (c:Company) return c limit 1"
187
302
  for record in tx.run(nql):
188
303
  print(record)
189
304
 
190
305
 
191
- with options.neo4j.session(database="test") as session:
306
+ with options.neo4j.session(database="invest") as session:
192
307
  session.execute_read(query)
193
308
 
194
309
 
195
310
  # neo4j异步测试
196
311
  async def query(tx):
197
- nql = "MATCH (t:Test) return t limit 1"
312
+ nql = "MATCH (c:Company) return c limit 1"
198
313
  res = await tx.run(nql)
199
314
  async for record in res:
200
315
  print(record)
201
316
 
202
317
 
203
318
  async def async_neo4j_test():
204
- async with options.neo4j.session(database="test") as session:
319
+ async with options.neo4j.session(database="invest") as session:
205
320
  await session.execute_read(query)
206
321
 
207
322
 
@@ -227,4 +342,5 @@ async def async_clickhouse_test():
227
342
  loop = asyncio.get_event_loop()
228
343
  loop.run_until_complete(async_clickhouse_test())
229
344
 
345
+
230
346
  ```
@@ -42,6 +42,6 @@ twine check dist/*
42
42
  twine upload dist/*
43
43
  twine upload dist/* --repository-url https://pypi.chanyeos.com/ -u admin -p shangqi
44
44
  # 安装最新的版本测试
45
- pip install -U lesscode_charts -i https://pypi.org/simple
46
- pip install -U lesscode_charts -i https://pypi.chanyeos.com/simple
45
+ pip install -U lesscode_database -i https://pypi.org/simple
46
+ pip install -U lesscode_database -i https://pypi.chanyeos.com/simple
47
47
  """
@@ -1 +0,0 @@
1
- __version__ = "0.0.3"