python - 如何在不编写 SQL 的情况下在 python 中使用 SQL 数据库?

标签 python sql sqlite orm

我正在寻找一种在 python 中使用 SQL 数据库(例如 MySQL、SQLite)而无需实际编写 SQL 的方法。示例将是这样的(伪代码):

# INSERT INTO table (firstname, lastname) VALUES ('John', 'Smith')
table.insert({'firstname':'John', 'lastname':'Smith'})

# SELECT * FROM table WHERE name='John'
results = table.select({'firstname': 'John'})
print results
# [ {'firstname':'John', 'lastname':'Smith'} ]

围绕 python 的 DB-API 的轻型包装器,或者可能是非常轻量级的 ORM,可以完成这项工作。如果它是一个 ORM,它应该允许将 namedtuple 映射到数据库,因为这几乎是我想要使用的唯一一种对象。我确定这样的东西已经存在,但我很难找到它:)

编辑 一些提议的解决方案不是我想要的:

SQL 炼金术

好:插入和选择相当简洁

不好:存储和检索的对象不是普通的 python dicts/namedtuples/任何东西(可能它们可以被做成 namedtuples,但如何做并不明显)

丑陋的:必须显式地为每个表创建一个类使得它太重量级了

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    ...

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)

our_user = session.query(User).filter_by(name='ed').first() 
our_user
<User(name='ed', fullname='Ed Jones', password='edspassword')>

小马ORM

好:将查询编写为生成器的方式纯属天才

不好的:仍然使用自定义对象,而不是内置的 python 数据类型

丑陋的:和SQL Alchemy一样,需要为每个表创建一个类

from pony.orm import *

db = Database()
class Person(db.Entity):
    name = Required(str)
    age = Required(int)

p1 = Person(name='John', age=20)
commit()

persons = select(p for p in Person if p.age > 20)

最佳答案

您只需要做一些更多的工作 - 通过阅读文档。 SQLAlchemy 可能具有最简单的“数据库逆向工程”形式(称为反射),详见 here .

最简单的例子:

from sqlalchemy import *

metadata = MetaData()
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
person_table = Table('person', metadata, autoload=True, autoload_with=engine)
q = person_table.insert().values(name='John', age=20)
connection = engine.connect()
connection.execute(q)

关于python - 如何在不编写 SQL 的情况下在 python 中使用 SQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504403/

相关文章:

sql - 表别名的范围是什么?

javascript - 如何通过 Javascript 从 HTML 文件连接到 Sqlite 数据库

python - Plotly 域变量解释(多图)

python - 类型错误 : 'module' object is not callable while opening chrome browser using selenium webdriver

Python 3.5 - 使用 @overload 重载方法

python - 加速我的 Fermat 分解函数 (Python)

mysql - 如何查找 12 月底即将到来的生日?

jquery - JQuery 中的简单 SQL 查询生成器

python - sqlalchemy:无法使用日期列保存模型

svn - 子剪辑错误 "svn: SQLite compiled for 3.8.6, but running with 3.8.5"