我正在使用SQLite作为我的基于PySide的桌面应用程序的应用程序文件格式(请参阅此处了解为什么要这样做).也就是说,当用户使用我的应用程序时,他们的数据将保存在其计算机上的单个数据库文件中.我正在使用SQLAlchemy ORM与数据库进行通信.
当我发布应用程序的新版本时,我可能会修改数据库架构.我不希望用户每次更改架构时都要丢弃他们的数据,所以我需要将他们的数据库迁移到最新的格式.此外,我创建了大量临时数据库来保存数据的子集,以便与某些外部进程一起使用.我想用alembic创建这些数据库,以便用正确的版本标记它们.
我有几个问题:
有没有办法从我的Python代码中调用alembic?我认为必须使用Popen纯Python模块是很奇怪的,但是文档只是从命令行使用alembic.主要是,我需要将数据库位置更改为用户数据库所在的位置.
如果这不可能,我可以从命令行指定新的数据库位置而不编辑.ini文件吗?这将使调用alembic Popen不是一件大事.
我看到,alembic将其版本信息保存在一个名为的简单表中alembic_version,其中一列被调用version_num,一行指定了版本.我可以alembic_version在我的架构中添加一个表,并在创建新数据库时使用最新版本填充它,这样就没有开销吗?这甚至是个好主意; 我应该使用alembic来创建所有数据库吗?
我的alembic非常适合我在项目目录中使用的单个数据库.我想使用alembic在任意位置方便地迁移和创建数据库,最好是通过某种Python API,而不是命令行.此应用程序也被cx_Freeze冻结,以防有所作为.
谢谢!
我有一个相当复杂的python应用程序,它使用numpy,pandas,PySide,pyqtgraph和matplotlib等软件包.当我在Windows上将应用程序与cx_Freeze捆绑在一起时,它的容量为349MB.
我的问题是生成的可执行文件有很长的启动时间约15秒.当我说启动时,我指的是任何代码执行之前的时间量.我有一个简单的脚本,可以向控制台输出"Hello",甚至需要15秒才能运行.
有谁知道这个问题的解决方案,或任何调试方法?它是否很慢,因为有这么多包中有这么多的.dll文件?
编辑:使用一个名为Process Montor的伟大工具,我已经将我的问题缩小到了pytz模块.在一个特定的负载上,20秒用于查询library.zip(其中cx_Freeze将所有编译的字节码放入)为pytz zoneinfo!我最近添加了pandas作为依赖项,而pandas使用了pytz.
有关Process Monitor输出的示例,请参见此图片:

编辑:解决方案是在第一个(let ...)表单中替换'(1)with(list 1).这是因为我试图修改文字数据.谢谢您的帮助!(我会放弃投票,但显然你需要15点声望......)
这是我在这个网站上的第一篇文章.
我今天解决了一些Project Euler问题,我在Common Lisp中遇到了一些意外的列表排序行为(至少对我来说):
我有一个函数,可以找到数字x的所有正确除数:
(defun divisors (x)
"Finds all of the proper divisors of x."
(let ((sq (sqrt x)) (divs '(1)))
(when (integerp sq) (push sq divs))
(loop for i from 2 to (1- (floor sq)) do
(let ((div (/ x i)))
(when (integerp div)
(push i divs)
(push div divs))))
divs))
Run Code Online (Sandbox Code Playgroud)
这个功能很棒.例如:
(divisors 100)
==> (20 5 25 4 50 2 10 1)
Run Code Online (Sandbox Code Playgroud)
每当我尝试对结果列表进行排序时,就会出现问题:
(sort (divisors 100) #'<)
==> (1 2 4 5 …Run Code Online (Sandbox Code Playgroud) 我试图从带有C扩展模块的Python 3包在Windows上创建一个exe.在distutils中,您可以创建如下的扩展:
from distutils.core import setup, Extension
module1 = Extension('demo',
sources = ['demo.c'])
setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1])
Run Code Online (Sandbox Code Playgroud)
然后,扩展将使用适当的编译器进行编译,并与命令一起放在其他模块旁边:
python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)
cx_Freeze是一个模块,可以将您的代码与Python解释器和相关的包一起打包到exe文件中.然后,最终用户可以在不安装Python的情况下使用您的程序.不幸的是,cx_Freeze没有Extension类,我找不到用cx_Freeze处理编译的方法.
我不确定的一个解决方案是首先使用distutils/setuptools构建扩展,然后使用cx_Freeze创建可执行文件.我不想重新发明轮子,所以我想知道在这个领域有更多经验的人是否有解决方案.
python ×3
cx-freeze ×2
windows ×2
alembic ×1
common-lisp ×1
distutils ×1
dll ×1
lisp ×1
sqlalchemy ×1
sqlite ×1