本文目录导读:

我来详细介绍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中灵活地操作数据库同义词了。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播