kgard <kag...@gmail.com> writes: > I am the lone developer of db apps at a company of 350+ > employees. Everything is done in MS Access 2010 and VBA. I'm > frustrated with the limitations of this platform and have been > considering switching to Python. I've been experimenting with the > language for a year or so, and feel comfortable with the basics. (...) > Has anyone here made this transition successfully? If so, could you > pass along your suggestions about how to do this as quickly and > painlessly as possible?
I went through a very similar transition a few years ago from standalone Access databases (with GUI forms, queries and reports, as well as replication) to a pure web application with full reporting (albeit centrally designed and not a report designer for users). I suppose my best overall suggestion is to migrate the data first and independently of any other activities. Unless your uses for Access in terms of GUI or reporting are extremely limited, don't try to replace your current system in one swoop, and in particular, be willing to continue allowing Access as long as necessary for GUI/reports until you're sure you've matched any current capabilities with an alternate approach. For all its warts, as a database GUI and reporting tool, Access has a lot going for it, and it can be more complex than you may think to replicate elsewhere. So the first thing I would suggest is to plan and implement a migration of the data itself. In my case I migrated the data from Access into PostgreSQL. That process itself took some planning and testing in terms of moving the data, and then correcting various bits of the schemas and data types (if I recall, booleans didn't round-trip properly at first), so was actually a series of conversions until I was happy, during which time everyone was using Access as usual. To support the migration, I created a mirror Access database to the production version, but instead of local Jet tables, I linked all the tables to the PostgreSQL server. All other aspects of the Access database (e.g., forms, reports, queries) remained the same, just now working off of the remote data. This needed testing too - for example, some multi-level joining in Access queries can be an issue. In some cases it was easier for me to migrate selected Access query logic into a database view and then replace the query in Access to use the view. You also need to (painfully) set any UI aspects of the table definitions manually since the linking process doesn't set that up, for which I used the original Access db as a model. I ended up doing that multiple times as I evolved the linked database, and I'll admit that was seriously tedious. While not required, I also wrapped up my new linked Access database into a simple installer (InnoSetup based in my case). Prior to this everyone was just copying the mdb file around, but afterwards I had an installer they just ran to be sure they had the latest version. If you do this part carefully, for your end users, aside from installing the new database, they see absolutely no difference, but you now have easy central access to the data, and most importantly can write other applications and tools against it without touching the Access side. It turns Access into just your GUI and reporting tool. If you have power users that make local changes they can continue to design additional queries or reports in their own local mdb against the linked tables. They'll need some extra support for updates though, either instructions to re-link, or instructions on exporting and importing their local changes into a newly installed version of your master mdb. Having done this, you are then free to start implementing, for example, a web based application to start taking over functionality. The nice thing is that you need not replicate everything at once, you can start slow or with the most desirable features, letting Access continue to handle the less common or more grungy legacy stuff at first. There are innumerable discussions on best web and application frameworks, so probably not worth getting into too much. In my case I'm using a CherryPy/Genshi/SQLAlchemy/psycopg2 stack. As long as you still have Access around, you'll have to take it into consideration with schema changes, but that's not really that much harder than any other schema migration management. It's just another client to the database you can run in parallel as long as you wish. If you do change the schema, when done, just load your master Access database, update the links, and rebuild/redistribute the installer to your users. Many changes (e.g., new columns with defaults) can be backwards compatible and avoid forced upgrades. You can operate both systems in parallel for a while even for similar functionality (for testing if nothing else), but can then retire functionality from Access as the web app supports it. Ideally this will be organic by your users preferring the web. Selecting when to drop Access entirely can then be driven by user demand. Or, for example, as is true in my case, none of my end users use Access any more, but I still have one tool for administrators that isn't worth replacing yet so they still use Access. One of my partners also just feels more comfortable making ad-hoc queries/reports in Access than tools like pgAdmin3 or iReport so I let him, as long as it's just for his personal use and I don't have to guarantee it won't break if I evolve the schema. On the reporting side, I really haven't found a good Python reporting solution that includes a solid solution for the designer side of the coin. Prior to this project I most often used ReportLab for dynamically produced reports (and still do) and its great, but I was really the only one designing those reports and do most of them in code. For this project, I wanted an independent report format along with a visual designer (so others could design reports for the system to execute). I settled on JasperReports, which has a well-defined jrxml format, and a nice report design tool iReport. Someone else posted about OpenRPT which was also on my short list at the time (along, I think, with Eclipse BIRT). JasperReports (and its ecosystem) has a bit of a learning curve - then again, all these tools do, including Access - for my part, I've been happy with the choice. Now, while amongst report designers you can just exchange report design files and use iReport, for end users you'll need a way to process those reports for your web app. There is a Jasper Server tool that is designed to organize and publish reports, but I found it overly-complicated for my use case and I wanted complete control of the end user interaction (hiding the reporting behind my web app). I settled on a really small (~150 line) Java servlet, running beneath Jetty, and configured to access the same PostgreSQL database. It accepts localhost-only HTTP report requests (with report parameters as query parameters) and delivers the result as a PDF. So my main web application, when needed, makes an internal http request to the reporting server on the same host, and then delivers the returned PDF to the end user. Once up and running, I can design a new report in iReport, and then drop the jrxml design file into the reporting folder on my server and it'll be available for the web application to use. This is the only non-Python server component (as far as my own code). As with the web app itself, this reporting operates in parallel with any remaining Access functionality, so you need not replicate every Access report all at once. To put this all in context, for myself (almost zero Access experience at the start, but plenty of Python and PostgreSQL experience), my data conversion probably took about 3 months overall for a relatively small Access database until everyone was working off of PostgreSQL under the covers. But that was all on my time, the actual switchover was quick once ready to release. While some of that scales with size, most of the time was figuring out the process and testing. To be truthful, I'm here maybe 4 years later, and still have some uses of Access in the system. I suppose I could have pushed harder to completely retire it, but honestly, by following the above process the remaining uses just don't bother or interfere with me that much. If they ever do I'll replicate those remaining bits of functionality elsewhere. -- David -- http://mail.python.org/mailman/listinfo/python-list