Skip to content

Commit 4c63243

Browse files
committed
Add namespace logic.
1 parent 7e2b12a commit 4c63243

File tree

4 files changed

+84
-2
lines changed

4 files changed

+84
-2
lines changed

mapper/test_namespace.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3+
<mapper namespace="test_namespace">
4+
<insert id="testInsert">
5+
INSERT INTO fruits (name, category, price) VALUES (#{name},#{category},#{price})
6+
</insert>
7+
<delete id="testDelete">
8+
DELETE FROM fruits WHERE id=#{id}
9+
</delete>
10+
<update id="testUpdate">
11+
UPDATE fruits SET name=#{name} WHERE id=#{id}
12+
</update>
13+
</mapper>

mybatis/mapper_manager.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,23 @@ def __init__(self):
99
self.replace_pattern = re.compile(r"\${([a-zA-Z0-9_\-]+)}")
1010

1111
def read_mapper_xml_file(self, mapper_xml_file_path):
12+
namespace = ""
1213
root = et.parse(mapper_xml_file_path).getroot()
1314
for child in root.iter():
1415
if child.tag == 'mapper':
16+
if "namespace" in child.attrib:
17+
namespace = child.attrib["namespace"]
1518
root = child
1619
break
1720

1821
for child in root:
1922
child_id = child.attrib["id"]
2023
if child_id is None:
2124
raise Exception("Missing id")
22-
self.id_2_element_map[child_id] = child
25+
if namespace == "":
26+
self.id_2_element_map[child_id] = child
27+
else:
28+
self.id_2_element_map[namespace+"."+child_id] = child
2329

2430

2531
# @staticmethod

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='mybatis',
5-
version='0.0.14',
5+
version='0.0.15',
66
description='A python ORM like mybatis.',
77
long_description=open('README.md').read(),
88
long_description_content_type='text/markdown', # 如果你使用的是Markdown格式的README

test/test_namespace.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import pytest
2+
import mysql.connector
3+
4+
from mybatis import Mybatis, MapperManager
5+
6+
7+
@pytest.fixture(scope="function")
8+
def db_connection():
9+
# 配置数据库连接
10+
connection = mysql.connector.connect(
11+
host="localhost",
12+
user="mybatis",
13+
password="mybatis",
14+
database="mybatis",
15+
autocommit=False,
16+
)
17+
connection.start_transaction()
18+
cursor = connection.cursor()
19+
cursor.execute("DROP TABLE IF EXISTS fruits")
20+
create_table_sql = '''CREATE TABLE IF NOT EXISTS fruits (
21+
id INT AUTO_INCREMENT PRIMARY KEY,
22+
name VARCHAR(100),
23+
category VARCHAR(100),
24+
price int)
25+
'''
26+
# 在测试开始前准备数据
27+
cursor.execute(create_table_sql)
28+
cursor.execute("INSERT INTO fruits (name, category, price) VALUES ('Alice', 'A', 100)")
29+
cursor.execute("INSERT INTO fruits (name, category, price) VALUES ('Bob', 'B', 200)")
30+
connection.commit()
31+
32+
# 提供数据库连接给测试用例
33+
yield connection
34+
35+
# 清理数据和关闭连接
36+
connection.close()
37+
38+
39+
def test_namespace(db_connection):
40+
mm = MapperManager()
41+
mm.read_mapper_xml_file("mapper/test_namespace.xml")
42+
43+
sql, param_list = mm.insert("test_namespace.testInsert", {'name': 'Alice', 'category': 'A', 'price': 100})
44+
assert sql == "INSERT INTO fruits (name, category, price) VALUES (?,?,?)"
45+
assert len(param_list) == 3
46+
assert param_list[0] == 'Alice'
47+
assert param_list[1] == 'A'
48+
assert param_list[2] == 100
49+
50+
sql, param_list = mm.delete("test_namespace.testDelete", {'id': 1})
51+
assert sql == "DELETE FROM fruits WHERE id=?"
52+
assert len(param_list) == 1
53+
assert param_list[0] == 1
54+
55+
sql, param_list = mm.update("test_namespace.testUpdate", {'name': 'Bob', 'id':1})
56+
assert sql == "UPDATE fruits SET name=? WHERE id=?"
57+
assert len(param_list) == 2
58+
assert param_list[0] == 'Bob'
59+
assert param_list[1] == 1
60+
61+
62+
63+

0 commit comments

Comments
 (0)