我相信可读性和KISS原则是编程中最重要的事情.这就是为什么我使用Python :)
这是确切的情况,我经常遇到:
说,我有一个漂亮而干净的脚本,它是数据库处理的包装器:
import database_schema as schema
loader = schema.Loader("sqlite:///var/database.db")
session = loader.session
def addUser(name, full_name, password):
user = schema.User(name, full_name, password)
session.add(user)
session.commit()
def listUsers():
all_users = session.query(schema.User).all()
return all_users
Run Code Online (Sandbox Code Playgroud)
使用方式如下:
import database
database.addUser("mike", "Mike Driscoll", "password")
database.listUsers()
Run Code Online (Sandbox Code Playgroud)
在某些时候,我想重写该模块,以便它可以在不同的路径上使用数据库(例如,用于单元测试).
那么,我的选择是什么?
最直观的是添加database_path == ""变量,然后......什么?使用setPath(new_path)函数设置它,然后将exception(if database_path == "": raise SomeException)添加到每个函数中,这只是丑陋的,任何人都不应该这样做.
全功能类,设置self._database_path初始化时间.
然后以这种方式使用:
from database import Database
database = Database("sqlite:///var/database.db")
database.addUser("mike", "Mike Driscoll", "password")
database.listUsers()
Run Code Online (Sandbox Code Playgroud)
这已经是比第一个例子更多的代码行,并且增加了命名问题:Database在模块中调用一个类database是愚蠢的,不是吗?
很抱歉长时间阅读,这里是我的最后一个问题:
__init__ …这是我的代码:
from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
database_url = 'mysql://some_path'
engine = create_engine(database_url)
Base = declarative_base(engine)
class Users(Base):
__tablename__ = 'Users'
__table_args__ = {'autoload':True}
metadata = Base.metadata
Session = sessionmaker(bind=engine)
session = Session()
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是...
我可以在需要时绑定引擎,而不仅仅是在导入时吗?所以我可以将这个实现包装到类中.
现在,我明白了
class Users(Base):
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.6.5-py2.5.egg/sqlalchemy/ext/declarative.py", line 1231, in __init__
_as_declarative(cls, classname, cls.__dict__)
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.6.5-py2.5.egg/sqlalchemy/ext/declarative.py", line 1122, in _as_declarative
**table_kw)
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.6.5-py2.5.egg/sqlalchemy/schema.py", line 209, in __new__
table._init(name, metadata, *args, **kw)
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.6.5-py2.5.egg/sqlalchemy/schema.py", line 260, in _init
msg="No …Run Code Online (Sandbox Code Playgroud)