小编kol*_*bos的帖子

从小脚本过渡到更大的应用程序并不容易

我相信可读性和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)

在某些时候,我想重写该模块,以便它可以在不同的路径上使用数据库(例如,用于单元测试).

那么,我的选择是什么?

  1. 最直观的是添加database_path == ""变量,然后......什么?使用setPath(new_path)函数设置它,然后将exception(if database_path == "": raise SomeException)添加到每个函数中,这只是丑陋的,任何人都不应该这样做.

  2. 全功能类,设置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是愚蠢的,不是吗?

很抱歉长时间阅读,这里是我的最后一个问题:

  1. 为什么__init__ …

python

5
推荐指数
1
解决办法
144
查看次数

在SQLAlchemy中使用declarative_base时,如何在需要时绑定引擎?

这是我的代码:

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)

python database orm sqlalchemy

5
推荐指数
2
解决办法
3122
查看次数

标签 统计

python ×2

database ×1

orm ×1

sqlalchemy ×1