本文目录导读:

我来详细介绍Python操作数据库同义词(Synonym)的几种方法:
使用cx_Oracle操作Oracle同义词
安装依赖
pip install cx_Oracle
创建和查询同义词
import cx_Oracle
# 连接数据库
connection = cx_Oracle.connect(
user="username",
password="password",
dsn="host:port/service_name"
)
cursor = connection.cursor()
# 创建同义词
create_synonym = """
CREATE PUBLIC SYNONYM emp_syn
FOR hr.employees
"""
cursor.execute(create_synonym)
# 通过同义词查询数据
cursor.execute("SELECT * FROM emp_syn WHERE ROWNUM <= 5")
for row in cursor.fetchall():
print(row)
# 删除同义词
drop_synonym = "DROP PUBLIC SYNONYM emp_syn"
cursor.execute(drop_synonym)
connection.commit()
cursor.close()
connection.close()
查询已有同义词
# 查询所有同义词
cursor.execute("""
SELECT * FROM ALL_SYNONYMS
WHERE OWNER = 'PUBLIC'
""")
for synonym in cursor.fetchall():
print(f"同义词名: {synonym[1]}, 对应表: {synonym[2]}.{synonym[3]}")
# 查询特定同义词
cursor.execute("""
SELECT * FROM ALL_SYNONYMS
WHERE SYNONYM_NAME = 'EMP_SYN'
""")
使用SQLAlchemy操作同义词
安装依赖
pip install sqlalchemy cx_Oracle
配置和使用
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
import urllib.parse
# 连接字符串
dsn = cx_Oracle.makedsn('host', port, service_name='service_name')
conn_str = f'oracle+cx_oracle://username:{urllib.parse.quote("password")}@{dsn}'
# 创建引擎
engine = create_engine(conn_str, echo=True)
# 通过同义词查询
with engine.connect() as conn:
result = conn.execute(text("SELECT * FROM emp_syn WHERE ROWNUM <= 5"))
for row in result:
print(row)
# 创建同义词
with engine.connect() as conn:
conn.execute(text("""
CREATE OR REPLACE PUBLIC SYNONYM dept_syn
FOR hr.departments
"""))
conn.commit()
使用pymssql操作SQL Server同义词
安装依赖
pip install pymssql
操作示例
import pymssql
# 连接数据库
conn = pymssql.connect(
server='host',
user='username',
password='password',
database='dbname'
)
cursor = conn.cursor()
# 创建同义词
cursor.execute("""
CREATE SYNONYM emp_syn
FOR HR.dbo.employees
""")
# 查询系统同义词
cursor.execute("""
SELECT * FROM sys.synonyms
WHERE name = 'emp_syn'
""")
# 使用同义词
cursor.execute("SELECT * FROM emp_syn")
rows = cursor.fetchall()
conn.commit()
conn.close()
完整的封装类示例
import cx_Oracle
from typing import List, Tuple, Optional
class SynonymManager:
"""数据库同义词管理器"""
def __init__(self, connection_string: str):
self.connection = cx_Oracle.connect(connection_string)
self.cursor = self.connection.cursor()
def create_synonym(self,
synonym_name: str,
target_table: str,
is_public: bool = False,
replace: bool = False) -> bool:
"""创建同义词"""
try:
public_clause = "PUBLIC" if is_public else ""
replace_clause = "OR REPLACE" if replace else ""
sql = f"""
CREATE {replace_clause} {public_clause}
SYNONYM {synonym_name}
FOR {target_table}
"""
self.cursor.execute(sql)
self.connection.commit()
return True
except Exception as e:
print(f"创建同义词失败: {e}")
return False
def drop_synonym(self,
synonym_name: str,
is_public: bool = False) -> bool:
"""删除同义词"""
try:
public_clause = "PUBLIC" if is_public else ""
sql = f"DROP {public_clause} SYNONYM {synonym_name}"
self.cursor.execute(sql)
self.connection.commit()
return True
except Exception as e:
print(f"删除同义词失败: {e}")
return False
def list_synonyms(self, owner: Optional[str] = None) -> List[Tuple]:
"""列出同义词"""
query = """
SELECT owner, synonym_name, table_owner, table_name, db_link
FROM all_synonyms
"""
if owner:
query += f" WHERE owner = '{owner}'"
self.cursor.execute(query)
return self.cursor.fetchall()
def query_via_synonym(self,
synonym_name: str,
columns: str = "*",
where_clause: Optional[str] = None,
limit: int = 100) -> List[Tuple]:
"""通过同义词查询数据"""
query = f"SELECT {columns} FROM {synonym_name}"
if where_clause:
query += f" WHERE {where_clause}"
if limit:
query += f" AND ROWNUM <= {limit}"
self.cursor.execute(query)
return self.cursor.fetchall()
def close(self):
"""关闭连接"""
self.cursor.close()
self.connection.close()
# 使用示例
def main():
# 初始化
conn_str = "username/password@host:port/service_name"
manager = SynonymManager(conn_str)
try:
# 创建同义词
success = manager.create_synonym(
synonym_name="emp_syn",
target_table="hr.employees",
is_public=True,
replace=True
)
print(f"创建同义词: {'成功' if success else '失败'}")
# 列出同义词
synonyms = manager.list_synonyms(owner="PUBLIC")
for syn in synonyms:
print(f"同义词: {syn[1]}, 指向: {syn[2]}.{syn[3]}")
# 查询数据
employees = manager.query_via_synonym(
synonym_name="emp_syn",
columns="employee_id, first_name, salary",
limit=10
)
for emp in employees:
print(emp)
finally:
manager.close()
if __name__ == "__main__":
main()
注意事项
-
权限要求:创建同义词需要相应权限,如Oracle中需要
CREATE SYNONYM或CREATE PUBLIC SYNONYM权限。 -
连接池:生产环境建议使用连接池:
from sqlalchemy.pool import QueuePool
pool = QueuePool( creator=lambda: cx_Oracle.connect(conn_str), pool_size=5, max_overflow=10 )
3. **事务管理**:DML操作需要事务管理:
```python
try:
# 执行操作
connection.commit()
except Exception as e:
connection.rollback()
raise e
- 错误处理:添加适当的错误处理机制:
try: cursor.execute(sql) except cx_Oracle.DatabaseError as e: error_obj, = e.args print(f"Oracle错误代码: {error_obj.code}") print(f"Oracle错误信息: {error_obj.message}")
这样你就可以在Python中灵活地操作数据库同义词了。